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

dav*_*ave 5 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) { ... }
Run Code Online (Sandbox Code Playgroud)

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

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

有什么建议?

Era*_*ran 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));
Run Code Online (Sandbox Code Playgroud)

要么

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