详细看代码
package com.example.demo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; /** * 通过 Stream 的 API 将 List 转 Map */ public class TestListToMapWithStreamApi { @Data @NoArgsConstructor @AllArgsConstructor public static class MyEnt { private String key; private String value; } public static void main(String[] args) { MyEnt m1 = new MyEnt("my_key1", "Stone"); MyEnt m2 = new MyEnt("my_key2", "Cassie"); MyEnt m3 = new MyEnt("my_key1", "Stone2"); // 构造 List List<MyEnt> list = new ArrayList<>(); list.add(m1); list.add(m2); list.add(m3); // 【将List转Map】 // 【1】强烈建议使用三参数的接口,否则在key出现重复后会出现运行时异常 // Map<String, MyEnt> map0 = list.stream().collect(Collectors.toMap(x -> x.getKey(), x -> x)); // System.out.println(map0);// Duplicate key TestListToMapWithStreamApi.MyEnt(key=my_key1, value=Stone) // 【2】三参接口:第一个指明什么作为key,第二个指明什么作为value,第三个是在key出现重复后如何处理 Map<String, MyEnt> map1 = list.stream().collect(Collectors.toMap(x -> x.getKey(), x -> x, (k1, k2) -> k1)); System.out.println(map1); // 【3】关于第三个参数的细节:含义是k1和k2假设key冲突保留谁的意思,上面那个方法保留k1,下面这个保留k2,两者打印的结果是不一样的,观察value值即可知道结论。 Map<String, MyEnt> map2 = list.stream().collect(Collectors.toMap(x -> x.getKey(), x -> x, (k1,k2) -> k2)); System.out.println(map2); } }