我有一个包含两个字符串的数组列表:
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做这个,即使用收集器还是减少?
答案 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开始时可用。