Java Stream Collectors.toList()不会编译

时间:2017-10-19 10:34:26

标签: 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);
}

收集

上的编译错误
  • IntStream类型中的方法collect(Supplier,ObjIntConsumer,BiConsumer)不适用于参数(Collector&gt;)
  • 类型不匹配:无法从收集器转换&gt;到供应商

编译

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);
}

3 个答案:

答案 0 :(得分:9)

IntStream没有接受collect的{​​{1}}方法。如果您需要Collector,则必须将List<Integer>加入IntStream

Stream<Integer>

out = IntStream .range(1, 10) .filter(e -> e % 2 == 0) .map(e -> 2 * e) .boxed() .collect(Collectors.toList()); 的替代方案是.map().boxed()

mapToObj()

或者您可以使用out = IntStream .range(1, 10) .filter(e -> e % 2 == 0) .mapToObj(e -> 2 * e) .collect(Collectors.toList ()); IntStream方法:

collect

答案 1 :(得分:1)

collect IntStream方法在不可编辑的情况下有所不同。

public <R> R collect(Supplier<R> supplier, ObjIntConsumer<R> accumulator, BiConsumer<R,R> combiner)

因此,它不接受您提供给collect

的参数

您可以通过将List<Integer>投射到IntStream

来解决这个问题

答案 2 :(得分:1)

在第一个示例中,您正在操作基本整数流。原始整数不能进入Listbasically because generics in Java are less than ideal。 Java语言设计师是working on potentially fixing this

与此同时,为了解决这个问题,您需要先将这些原始内容打包成Integer wrapper。有关代码示例,请参阅Eran's answer

在第二个示例中,您已经在Integer上进行了迭代,因此 It Just Works ™。

  

当我这么做的时候,我以为我正在将那些int装入整数   映射器中的Integer.valueOf

map function of IntStreamIntUnaryOperator这是一个函数接口,它接受一个原始int并返回一个原语int。

您从Integer获得的valueOf已取消装箱以匹配功能界面。