如何将整数流过滤到列表中?

时间:2017-07-09 08:47:08

标签: java java-8 java-stream

我正在尝试处理Integers的流,并将与谓词匹配的整数(通过compare()函数)收集到列表中。这是我编写的代码的大致轮廓。

private List<Integer> process() {
    Z z = f(-1);
    return IntStream.range(0, 10)
        .filter(i -> compare(z, f(i)))
        .collect(Collectors.toCollection(ArrayList::new)); // Error on this line
}

private boolean compare(Z z1, Z z2) { ... }
private Z f(int i) { ... }

不幸的是我的解决方案没有编译,我无法理解突出显示的行的编译器错误:

  

IntStream类型中的方法collect(Supplier&lt; R&gt;,ObjIntConsumer&lt; R&gt;,BiConsumer&lt; R,R&gt;)不适用于参数(Collector&lt; Object,capture#1-of?,Collection&lt; Object&gt; &GT)

有什么建议吗?

2 个答案:

答案 0 :(得分:6)

IntStream不包含collect方法,该方法接受Collector类型的单个参数。 Stream。因此,您必须将IntStream转换为Stream个对象。

您可以将IntStream打包到Stream<Integer>或使用mapToObj来实现相同目标。

例如:

return IntStream.range(0, 10)
    .filter(i -> compare(z, f(i)))
    .boxed()
    .collect(Collectors.toCollection(ArrayList::new));

return IntStream.range(0, 10)
    .filter(i -> compare(z, f(i)))
    .mapToObj(Integer::valueOf)
    .collect(Collectors.toCollection(ArrayList::new));

答案 1 :(得分:2)

您可以自己指定Supplier, Accumulator and Combiner

 IntStream.range(0, 10)
            .filter(i -> compare(z, f(i)))  
            .collect(ArrayList::new, ArrayList::add, ArrayList::addAll);