【问题标题】:Java 8 Filter Array Using Lambda使用 Lambda 的 Java 8 过滤器数组
【发布时间】: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)

标签: java lambda java-8


【解决方案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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多