在 Java8 中将二维字符串数组转换为映射

问题描述 投票:0回答:1

似乎是一个非常基本的问题,我想将我的二维字符串数组转换为一个

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 的解决方案。

java hashmap java-stream collectors
1个回答
2
投票

由于流中的元素是

String[]
类型,因此您当前的收集器

Collectors.groupingBy(e-> e[1], Collectors.toList())

Map 的值将是

List<String[]>
类型(虽然您需要一个
List<String>
,而不是数组列表)。因此,您需要将下游 Collector 接收到的流元素进行转换,然后再将它们存储到 List 中。

正如@Roguecomment中指出的那样,您需要使用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]
© www.soinside.com 2019 - 2024. All rights reserved.