使用java 8 Stream将字符串数组按其第一个值分组

时间:2018-05-25 14:15:16

标签: java-8 java-stream

我有一个包含两个字符串的数组列表:

List<String[]> pets = {["Alice", "dog"], ["Bob", "horse"], ["Alice", "cat"], ["Bob", "cat"]}

我想将它们转换为从字符串到字符串列表的映射,如下所示:

Map<String, List<String>>> pets = Map where
"Alice" maps to the List {"dog, "cat"}
"Bob" maps to the List {"horse", "cat"}

即。我们获取数组的第一个元素,并将第一个元素彼此相等的所有元素组合在一起。解决这个问题的必要方法是循环遍历元素,逐步构建Map。有没有办法用java Streams做这个,即使用收集器还是减少?

1 个答案:

答案 0 :(得分:1)

当然,你可以!

您可以按每个数组的第一个元素进行分组,然后应用映射收集器来获取相应的值。

clear

或:

 Map<String, List<String>> resultSet = pets.stream()
                .collect(groupingBy(array -> array[0],
                        collectingAndThen(mapping(e -> Arrays.copyOfRange(e, 1, e.length),
                                toList()),
                                f -> f.stream().flatMap(Arrays::stream)
                                .collect(toList()))));

注意,此解决方案使用 Map<String, List<String>> resultSet = pets.stream() .collect(groupingBy(array -> array[0], flatMapping(e -> Arrays.stream(Arrays.copyOfRange(e, 1, e.length)), toList()))); 收集器,该收集器仅在JDK-9开始时可用。