似乎是一个非常基本的问题,我想将我的二维字符串数组转换为一个
Map
以 List
作为值。
我试过类似下面的东西:
Map<String, List<String>> guestMap = Arrays
.stream(guests)
.collect(Collectors.groupingBy(e-> e[1], Collectors.toList()));
我的嵌套字符串数组是这样的
String[][] guests = {
{"A", "lizzard"},
{"B", "Gorilla"},
{"C", "lizzard"},
{"D", "Gorilla"},
{"E", "lizzard"},
{"F", "Gorilla"},
{"G", "lizzard"},
{"H", "Monkey"},
{"I", "lizzard"}
};
我知道使用
computeIfAbsent()
解决它的方法。但我正在寻找一个纯粹使用 Stream API 的解决方案。
由于流中的元素是
String[]
类型,因此您当前的收集器
Collectors.groupingBy(e-> e[1], Collectors.toList())
Map 的值将是
List<String[]>
类型(虽然您需要一个 List<String>
,而不是数组列表)。因此,您需要将下游 Collector 接收到的流元素进行转换,然后再将它们存储到 List 中。
正如@Rogue在comment中指出的那样,您需要使用Collector
mapping()
和groupingBy()
的下游。并且toList()
应该依次作为mapping()
的下游收集器提供。
String[][] guests = {
{"A", "lizzard"},
{"B", "Gorilla"},
{"C", "lizzard"},
{"D", "Gorilla"},
{"E", "lizzard"},
{"F", "Gorilla"},
{"G", "lizzard"},
{"H", "Monkey"},
{"I", "lizzard"}
};
Map<String, List<String>> guestMap = Arrays.stream(guests)
.collect(Collectors.groupingBy(
e -> e[1],
Collectors.mapping(e -> e[0],
Collectors.toList())
));
guestMap.forEach((k, v) -> System.out.println(k + " -> " + v));
输出:
Monkey -> [H]
lizzard -> [A, C, E, G, I]
Gorilla -> [B, D, F]