list转map的时候,忘记了map的key不能重复的问题;
其实初衷就是想 利用map的key不能重复的问题。。。。
将list转为map,原以为是遍历list的方式,存map,然后map的key重复的话,直接覆盖了。。。
但是java8 中stream 确给我挖了个坑。。。
List<String> list = new ArrayList<>();
list.add("zhangsan");
list.add("lisi");
list.add("zhangsan");
//1 stream 流式判断是否 x1和x2相同,相同则取x1
Map<String, String> collect = list.stream().collect(Collectors.toMap(x -> x, x -> "", (x1, x2) -> x1));
System.out.println("success,map的size为:" + collect.size());
//2 没有做前后数据的对比,一股脑的往map中塞key
// Map<String, String> collectError = list.stream().collect(Collectors.toMap(x -> x, x -> ""));
// System.out.println("error: java.lang.IllegalStateException: Duplicate key ");
//3 map中判断是否存在,不存在就put,存在就不要了
Map map = new HashMap();
for (String str : list) {
if (!map.containsKey(str)) {
map.put(str, "");
}
}
System.out.println("success,map的size为:" + map.size());
//4 map中直接put。有形同的就直接更新了。。可以保证唯一性
Map map1 = new HashMap();
for (String str : list) {
map1.put(str,"");
}
System.out.println("success,map1的size为:" + map1.size());
另:如果是以某个对象的某个属性作为key,则stream的写法也就是和getKey不通而已
/**
* List -> Map
* 需要注意的是:
* toMap 如果集合对象有重复的key,会报错Duplicate key ....
* apple1,apple12的id都为1。
* 可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2
*/
Map<Integer, Apple> appleMap = appleList.stream().collect(Collectors.toMap(Apple::getId, a -> a, (k1, k2) -> k1));
补充的是,不管那种方法,list是否为空,对操作不受影响。。。。所以,不用考虑。。。
//TODO
1,MAP 中key不能重复的原理
2,stream不加判断是否相同的判断,putkey duplicate key的问题;;加了判断,只是前后两个比较的吗??
贴个链接,谢谢 https://www.cnblogs.com/yangweiqiang/p/6934671.html