使用 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 过滤器数组的主要内容,如果未能解决你的问题,请参考以下文章