Collectors.groupingBy 的 Java 8 类型检查

标签 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"]}

最佳答案

The problem is with s -> s[0], where s is inferred to be a generic type T instead of 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]}

关于Collectors.groupingBy 的 Java 8 类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41459227/

相关文章:

java - 持久保存数据

java - 我想知道使用 Sonar 的最佳方法是什么?

java - 从 Android 上的 Google Drive 下载 Google Sheets 电子表格

Java 8 - 对列表进行分组并查找计数

java - 如何使用流打印HashMap中值的键

java - LinearLayout 中的多个 TableLayouts - Android

未找到 Java 8 总和和总数

Java 8 打破递归循环

java - 如何让使用 Unsafe 的 java 8 代码在 jdk 8 和 jdk 9 上工作?

java - 如何使用 Java 流将一组对象转换为对象字段到一组字段的映射?