我正在尝试处理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)
有什么建议吗?
答案 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);