使用Lambda的Java 8过滤器阵列

时间:2014-06-09 01:50:11

标签: java lambda java-8

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

在python中,这将使用生成器:

[i for i in x if i > 0]

是否有可能在Java 8中做同样简洁的事情?

2 个答案:

答案 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]