[英]Java Stream Collectors.toList() wont compile
任何人都可以解釋為什么下面的代碼不能編譯但第二個代碼呢?
不要編譯
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);
}
IntStream
沒有接受Collector
的collect
方法。 如果需要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
方法:
out = IntStream
.range(1, 10)
.filter(e -> e % 2 == 0)
.map(e -> 2 * e)
.collect(ArrayList<Integer>::new, ArrayList::add, ArrayList::addAll);
IntStream
的collect
方法在不可編譯的情況下是不同的。
public <R> R collect(Supplier<R> supplier, ObjIntConsumer<R> accumulator, BiConsumer<R,R> combiner)
因此,它不接受您提供的參數來collect
你可以通過將List<Integer>
轉換為IntStream
來解決這個IntStream
在第一個示例中,您正在對原始整數流進行操作。 原始整數不能進入List
, 主要是因為Java中的泛型不太理想 。 Java語言設計師正在努力解決這個問題 。
在此期間,要解決此問題,您需要首先將這些原始int 打包到Integer
包裝器中 。 請參閱Eran的代碼示例答案 。
在第二個例子中,你已經迭代了Integer
所以It Just Works ™。
當我在mapper中執行Integer.valueOf時,我以為我正在將這些int裝入Integers
IntStream
的map
函數采用IntUnaryOperator
,它是一個函數接口,它接受一個原始int並返回一個原語int。
從valueOf
獲得的Integer
是未裝箱的,以匹配功能界面。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.