任何人都可以解释为什么下面的代码不会编译但第二个代码会编译吗?
不编译
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);
}
收集行
上的编译错误编译
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);
}
答案 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)
在第一个示例中,您正在操作基本整数流。原始整数不能进入List
,basically 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 IntStream
取IntUnaryOperator
这是一个函数接口,它接受一个原始int并返回一个原语int。
您从Integer
获得的valueOf
已取消装箱以匹配功能界面。