List转Map duplicate key问题

list转map的时候,忘记了map的key不能重复的问题;

 

其实初衷就是想 利用map的key不能重复的问题。。。。

 

将list转为map,原以为是遍历list的方式,存map,然后map的key重复的话,直接覆盖了。。。

 

但是java8 中stream 确给我挖了个坑。。。

 

List list = new ArrayList<>();
        list.add("zhangsan");
        list.add("lisi");
        list.add("zhangsan");

        //1 stream 流式判断是否 x1和x2相同,相同则取x1
        Map collect = list.stream().collect(Collectors.toMap(x -> x, x -> "", (x1, x2) -> x1));
        System.out.println("success,map的size为:" + collect.size());

        //2 没有做前后数据的对比,一股脑的往map中塞key
//        Map 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 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

 

 

你可能感兴趣的:(性能优化,日常问题,stream,lmada,list装map)