使用 Lambda 的 Java 8 过滤器数组

Posted

技术标签:

【中文标题】使用 Lambda 的 Java 8 过滤器数组【英文标题】:Java 8 Filter Array Using Lambda 【发布时间】:2014-07-29 13:07:34 【问题描述】:

我有一个double[],我想在一行中过滤掉(创建一个没有的新数组)负值而不添加for 循环。这可以使用 Java 8 lambda 表达式吗?

在 python 中,它会使用生成器:

[i for i in x if i > 0]

是否可以在 Java 8 中做类似的简洁操作?

【问题讨论】:

过滤掉是什么意思?您的意思是创建一个没有这些值的新数组吗? 不确定是否可以使用double[],但使用List 很容易:dreamsyssoft.com/java-8-lambda-tutorial/filter-tutorial.php 仅供参考,这称为列表理解。生成器使用括号,如下所示:(i for i in x if i > 0) 【参考方案1】:

是的,您可以通过从数组中创建DoubleStream、过滤掉负数并将流转换回数组来实现这一点。这是一个例子:

double[] d = 8, 7, -6, 5, -4;
d = Arrays.stream(d).filter(x -> x > 0).toArray();
//d => [8, 7, 5]

如果要过滤不是Object[] 的引用数组,则需要使用toArray 方法,该方法采用IntFunction 来获取原始类型的数组作为结果:

String[] a =  "s", "", "1", "", "" ;
a = Arrays.stream(a).filter(s -> !s.isEmpty()).toArray(String[]::new);

【讨论】:

我认为这和 Java 一样简洁:D 我觉得应该是 double[] toArray = Arrays.stream(d).filter(x -> x > 0).toArray(); @Raj 如果您想将返回的数组分配给单独的引用,这也是有效的。 我认为对toArray() 的调用将返回Object [],因此第二行可能会因强制转换异常而失败。谢谢! @JesúsZazueta 我已经编辑了答案,这能解决你的问题吗?【参考方案2】:

更简单,加起来就是String[]

使用内置过滤器filter(StringUtils::isNotEmpty) of org.apache.commons.lang3

import org.apache.commons.lang3.StringUtils;

    String test = "a\nb\n\nc\n";
    String[] lines = test.split("\\n", -1);


    String[]  result = Arrays.stream(lines).filter(StringUtils::isNotEmpty).toArray(String[]::new);
    System.out.println(Arrays.toString(lines));
    System.out.println(Arrays.toString(result));

和输出: [a, b, , c, ] [a, b, c]

【讨论】:

以上是关于使用 Lambda 的 Java 8 过滤器数组的主要内容,如果未能解决你的问题,请参考以下文章

lambda去重

Java学习笔记3.9.4 Lambda表达式 - 操作数组

java 动态 Lambda

java 动态 Lambda

java 动态 lambda

java 动态 lambda