collectors.groupingby的java 8类型检查

wbgh16ku  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(382)

为了进行以下代码类型检查,我需要做什么?问题在于 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"]}
n53p2ov0

n53p2ov01#

问题在于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步骤。
例如:

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]}

相关问题