Collectors.groupingBy的Java 8类型检查

时间:2017-01-04 08:24:44

标签: 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]));

预期结果应为Map,如下所示:

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

1 个答案:

答案 0 :(得分:8)

  

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

实际上这不是问题。 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]}