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
相关产品推荐
相关产品推荐

