You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java8中基于Stream API将二维字符串数组转换为值为List的Map

Java8中基于Stream API将二维字符串数组转换为值为List的Map

嘿,你的思路其实已经走对了大半,只是差了一步关键的元素转换操作~

你原来的代码用Collectors.groupingBy的方向完全没问题,但默认的Collectors.toList()会把整个String[]对象收集到List里,而你想要的是数组里的第一个元素(比如"A"、"C"这些客人名字)作为List的元素。

只需要在下游收集器里加一层Collectors.mapping,用来提取每个数组的第一个元素,再转成List就可以实现纯Stream API的解决方案了。

完整示例代码

import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

public class GuestMapConverter {
    public static void main(String[] args) {
        String[][] guests = {
            {"A", "lizzard"},
            {"B", "Gorilla"},
            {"C", "lizzard"},
            {"D", "Gorilla"},
            {"E", "lizzard"},
            {"F", "Gorilla"},
            {"G", "lizzard"},
            {"H", "Monkey"},
            {"I", "lizzard"}
        };

        // 纯Stream API实现转换
        Map<String, List<String>> guestMap = Arrays.stream(guests)
            .collect(Collectors.groupingBy(
                entry -> entry[1], // 以动物类型作为分组键
                Collectors.mapping(entry -> entry[0], Collectors.toList()) // 提取客人名字并收集为List
            ));

        // 打印结果验证
        guestMap.forEach((animal, guestsList) -> System.out.println(animal + ": " + guestsList));
    }
}

运行结果

lizzard: [A, C, E, G, I]
Gorilla: [B, D, F]
Monkey: [H]

逻辑说明

  • Arrays.stream(guests):将二维字符串数组转换为Stream<String[]>,每个流元素是一个包含客人名字和对应动物的数组。
  • Collectors.groupingBy(entry -> entry[1]):按照数组的第二个元素(动物类型)作为键对元素进行分组。
  • Collectors.mapping(entry -> entry[0], Collectors.toList()):这是下游收集器,先把每个数组元素转换成它的第一个元素(客人名字),再将这些名字收集为List,作为对应键的值。

这样就完全用Stream API实现了你要的效果,不需要依赖computeIfAbsent方法~

备注:内容来源于stack exchange,提问作者LowCool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 07:44:54