Java如何将List转成Map,及其细节(Java中用Stream)
详细看代码
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);
}
}