2017-01-04 49 views
4

爲了進行以下代碼類型檢查,我需要做些什麼?問題在於s -> s[0],其中s被推斷爲通用類型T而不是String[]Java 8類型檢查Collectors.groupingBy

List<String[]> a = Arrays.asList("a.b","c.b") 
         .stream() 
         .map(s->s.split("\\.")) 
         .collect(Collectors.toList()); 
Map<String,List<String>> b = a.stream() 
           .collect(Collectors.groupingBy(s -> s[0])); 

預期的結果應該是一個Map這樣的:

{a: ["a.b"], 
c: ["c.b"]} 
+1

什麼是您的實際輸入時,'列表'或'名單'含有' 「A·B」 和 「C.B」'?在後一種情況下,不需要執行兩步操作,事實上,甚至不需要使用「分割」... – Holger

回答

8

的問題是與S - > S [0],其中S是推斷爲一個通用的類型T,而不是串[]。

其實這不是問題。 s被正確推斷爲String[]。 然而,

a.stream().collect(Collectors.groupingBy(s -> s[0])); 

產生Map<String,List<String[]>>,而不是一個Map<String,List<String>>。那就是問題所在。

如果您想將String陣列的String秒合併到一個String中,則需要額外的映射步驟。

例如:

Map<String,List<String>> b = 
    a.stream() 
    .collect(Collectors.groupingBy(s -> s[0], 
            Collectors.mapping (s -> String.join (".", s), 
                 Collectors.toList()))); 

輸出:

{a=[a.b], c=[c.b]}