我有一個與此堆疊溢位問題類似的用例,并試圖使用它而不將結果存盤在 a 中List<List<String>>
,而是呼叫stream()
它。
如果List<List<String>>
由于型別不匹配而未將其分配給它,則會出現奇怪的編譯時錯誤。要重現該問題,只需注釋掉輸出的分配。
問題是為什么會出現這個編譯錯誤?以及如何解決?
public static void main(String args[]) {
List<String> input = Arrays.asList("RED", "RED", "BLUE", "BLUE", "BLUE", "BLUE", "RED", "RED");
List<List<String>> output = // if this line commented it doesn't compile
input.stream()
.collect(Collector.of(
ArrayList::new,
(accumulator, item) -> {
if (accumulator.isEmpty()) {
List<String> list = new ArrayList<>();
list.add(item);
accumulator.add(list);
} else {
List<String> last = accumulator.get(accumulator.size() - 1);
if (last.isEmpty() || last.get(0).equals(item)) {
last.add(item);
} else {
List<String> list = new ArrayList<>();
list.add(item);
accumulator.add(list);
}
}
},
(left, right) -> {
left.addAll(right);
return left;
}
));
}
我的想法是像這樣使用它:
input.stream()
.collect(Collector.of(.....))
.stream()
.(and do something else)
uj5u.com熱心網友回復:
Java 中的函式本身沒有型別。它們是poly 運算式。這意味著它們的型別應該從背景關系中推斷出來。它適用于Collector.of()
.
List<List<String>> output
- 提供目標型別,沒有它,型別推斷機制不知道您的 Collector 預計會產生什么型別的物件。
要編譯代碼,您可以在呼叫Collector.<all the types of functions used in collector here>of()
.
編譯此流陳述句的最簡單方法是提供累加器的顯式引數型別:
(List<List<String>> accumulator, String item) ->
{
...
},
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/506769.html