我有一个double[]
,我想在一行中过滤掉(创建一个没有新的数组)负值而不添加for
循环。这可能是使用Java 8 lambda表达式吗?
在python中,这将使用生成器:
[i for i in x if i > 0]
是否有可能在Java 8中做同样简洁的事情?
答案 0 :(得分:90)
是的,您可以通过从阵列创建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);
答案 1 :(得分:1)
更简单,加起来为String[]
,
使用filter(StringUtils::isNotEmpty)
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]