Java 8使用Lambda表达式过滤数组

96

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

在Python中使用生成器将如下实现:

[i for i in x if i > 0]

在Java 8中是否有类似简洁的方法?


“Filter out” 的意思是什么?你是指创建一个新的数组而不包括那些值吗? - Sotirios Delimanolis
2
不确定是否可以使用 double[],但使用 List 很容易:http://www.dreamsyssoft.com/java-8-lambda-tutorial/filter-tutorial.php - Avery
2
FYI,这被称为列表推导式。生成器使用括号,像这样:(i for i in x if i > 0) - djsmith
2个回答

149

是的,您可以通过从数组创建一个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);

5
我认为这已经是Java能够更加简明的表达方式了:D - Makoto
我认为应该这样写:double[] toArray = Arrays.stream(d).filter(x -> x > 0).toArray(); - Raj
@Raj,如果你想将返回的数组分配给一个单独的引用,那也是有效的。 - Alex - GlassEditor.com
6
我认为调用 toArray() 方法会返回一个 Object[] 数组,所以第二行可能会因为类型转换异常而失败。谢谢! - Jesús Zazueta
1
@JesúsZazueta 我已经编辑了答案,这解决了你的问题吗? - Alex - GlassEditor.com

3
更简单的方法是将 String[] 相加,使用 org.apache.commons.lang3 的内置过滤器 filter(StringUtils::isNotEmpty)
请导入 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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接