Java Stream Collectors.toList()不会编译

Vas*_*sco 3 java java-stream collectors

任何人都可以解释为什么下面的代码不能编译但第二个代码呢?

不要编译

private void doNotCompile() {

    List<Integer> out;
    out = IntStream
            .range(1, 10)
            .filter(e -> e % 2 == 0)
            .map(e -> Integer.valueOf(2 * e))
            .collect(Collectors.toList());

    System.out.println(out);
}
Run Code Online (Sandbox Code Playgroud)

收集行上的编译错误

  • IntStream类型中的方法collect(Supplier,ObjIntConsumer,BiConsumer)不适用于参数(Collector>)
  • 类型不匹配:无法从收集器>转换为供应商

编译

private void compiles() {
    List<Integer> in;

    in = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
    List<Integer> out;
    out = in.stream()
            .filter(e -> e % 2 == 0)
            .map(e -> 2 * e)
            .collect(Collectors.toList());

    System.out.println(out);
}
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 9

IntStream没有collect接受a 的方法Collector.如果你想要一个List<Integer>,你必须把它IntStream装入Stream<Integer>:

out = IntStream
        .range(1, 10)
        .filter(e -> e % 2 == 0)
        .map(e -> 2 * e)
        .boxed()
        .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

另一种选择.map().boxed()mapToObj():

out = IntStream
        .range(1, 10)
        .filter(e -> e % 2 == 0)
        .mapToObj(e -> 2 * e)
        .collect(Collectors.toList ());
Run Code Online (Sandbox Code Playgroud)

或者你可以使用这个IntStream collect方法:

out = IntStream
        .range(1, 10)
        .filter(e -> e % 2 == 0)
        .map(e -> 2 * e)
        .collect(ArrayList<Integer>::new, ArrayList::add, ArrayList::addAll);
Run Code Online (Sandbox Code Playgroud)