Collectors.groupingBy的Java 8类型检查

use*_*545 4 java java-8 java-stream

为了进行以下代码类型检查,我需要做什么?问题在于s -> s[0],s推断为通用类型T而不是String[].

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]));
Run Code Online (Sandbox Code Playgroud)

预期结果应该是Map这样的:

{a: ["a.b"],
 c: ["c.b"]}
Run Code Online (Sandbox Code Playgroud)

Era*_*ran 8

问题在于s - > s [0],其中s被推断为泛型类型T而不是String [].

实际上那不是问题.s正确推断为String[].然而,

a.stream().collect(Collectors.groupingBy(s -> s[0]));
Run Code Online (Sandbox Code Playgroud)

产生一个Map<String,List<String[]>>,而不是一个Map<String,List<String>>.那就是问题所在.

如果要将数组的Strings 加入String单个数组String,则需要额外的映射步骤.

例如 :

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

输出:

{a=[a.b], c=[c.b]}
Run Code Online (Sandbox Code Playgroud)