使用Lambda的Java 8过滤器数组


74

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

在python中,将使用生成器:

[i for i in x if i > 0]

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


过滤掉是什么意思?您的意思是创建没有这些值的新数组吗?
Sotirios Delimanolis 2014年

2
不确定是否可以使用double[],但很容易实现Listdreamsyssoft.com/java-8-lambda-tutorial/filter-tutorial.php
Avery

2
仅供参考,称为列表理解。生成器使用括号,例如:(i for i in x if i > 0)
djsmith,

Answers:


121

是的,您可以通过DoubleStream从数组创建a ,滤除负片,然后将流转换回数组来实现此目的。这是一个例子:

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);

4
我认为这与Java一样简洁:D
Makoto 2014年

我认为应该是double [] toArray = Arrays.stream(d).filter(x-> x> 0).toArray();
2014年

如果要将返回的数组分配给单独的引用,@ Raj也有效。
亚历克斯-GlassEditor.com 2014年

6
我认为对的调用toArray()将返回一个Object [],因此第二行可能会因强制转换异常而失败。谢谢!
赫苏斯Zazueta

1
@JesúsZazueta我已经编辑了答案,这可以解决您的问题吗?
亚历克斯-GlassEditor.com

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]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.