JAVA8-Lambda-List转Map

List转Map需要注意点是在收集map时Collectors.toMap()建议选三个入参的方法。

示例如下:(注意list中的“张三”有两个我们将其作为Map的key)

####无第三个参数示例 
    public static void main(String[] args) {
        ArrayList<Student> list = new ArrayList<Student>();
        list.add(new Student("张三", 19, "杭州"));
        list.add(new Student("李四", 18, "北京"));
        list.add(new Student("张三", 17, "西安"));
        list.add(new Student("赵六", 16, "兰州"));

        Map<String, Student> map = list.stream()
                .collect(Collectors.toMap(Student::getName, student -> student));

        System.out.println(map.toString());
    }

执行结果:(Duplicate key 提示key重复,收集map时不知道保留哪个key)

有第三个参数示例: 第三个参数是指明当key重复时,我需要用哪一个

    // (k1, k2) -> k2)  当key重复时要将后面出现的作为我的收集对象,抛弃前面已收集的。
    // (k1, k2) -> k1)  当key重复时保留已收集的,抛弃新出现的。
       public static void main(String[] args) {
        ArrayList<Student> list = new ArrayList<Student>();
        list.add(new Student("张三", 19, "杭州"));
        list.add(new Student("李四", 18, "北京"));
        list.add(new Student("张三", 17, "西安"));
        list.add(new Student("赵六", 16, "兰州"));

        Map<String, Student> map = list.stream()
                .collect(Collectors.toMap(Student::getName, student -> student, (k1, k2) -> k1));

        System.out.println(map.toString());
    }

(k1, k2) -> k2)的结果:(张三的结果是list中最后一次出现的(索引最大的))

{李四=Student{name='李四', age=18, addr='北京'}, 张三=Student{name='张三', age=17, addr='西安'}, 赵六=Student{name='赵六', age=16, addr='兰州'}}

(k1, k2) -> k1)的结果:(张三的结果是list中第一次出现的(索引最小的))

{李四=Student{name='李四', age=18, addr='北京'}, 张三=Student{name='张三', age=19, addr='杭州'}, 赵六=Student{name='赵六', age=16, addr='兰州'}}
posted @ 2022-11-05 11:39  CodeLuckly  阅读(721)  评论(0编辑  收藏  举报