使用Java8的Stream流的Collectors.toMap来生成Map结构

问题描述

在日常开发中总会有这样的代码,将一个List转为Map集合,使用其中的某个属性为key,某个属性为value。

常规实现

java 复制代码
public class CollectorsToMapDemo {

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Student {
        private String name;
        private Integer age;
    }

    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student("张三", 18));
        list.add(new Student("李四", 19));
        list.add(new Student("王五", 20));

        // 将这个list转为map集合,key=age,value=student
        Map<Integer, Student> map = new HashMap<>();
        for (Student student : list) {
            if (map.containsKey(student.getAge())) {
                // 如果key已经存在的解决逻辑
                map.put(student.getAge(), student);
            } else {
                map.put(student.getAge(), student);
            }
        }
    }
}

Java8实现

java 复制代码
public class CollectorsToMapDemo {

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Student {
        private String name;
        private Integer age;
    }

    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student("张三", 18));
        list.add(new Student("李四", 19));
        list.add(new Student("王五", 20));

        // 将这个list转为map集合,key=age,value=student
        Map<Integer, Student> map = list.stream().collect(Collectors.toMap(Student::getAge, Function.identity()));
        System.out.println(map);
    }
}

输出结果:

解释一下参数:

第一个参数:Student::getAge表示选择Student的getAge作为map的key值;

第二个参数:Function.identity()表示选择将原来的对象作为Map的value值;(也可以使用s -> s来表示选对象)

key值重复,就会报错。

java 复制代码
public class CollectorsToMapDemo {

    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public static class Student {
        private String name;
        private Integer age;
    }

    public static void main(String[] args) {
        List<Student> list = new ArrayList<>();
        list.add(new Student("张三", 18));
        list.add(new Student("李四", 19));
        list.add(new Student("王五", 20));
        list.add(new Student("赵六", 18));

        // 将这个list转为map集合,key=age,value=student
        Map<Integer, Student> map = list.stream().collect(Collectors.toMap(Student::getAge, Function.identity()));
        System.out.println(map);
    }
}

输出结果:

如何解决:

要传第三个参数,就是key值重复的处理逻辑。

例如传(a, b) -> b就表示a和b重复选后输入的b元素。

Map<Integer, Student> map = list.stream().collect(Collectors.toMap(Student::getAge, Function.identity(), (a,b)->b));

相关推荐
mask哥6 天前
详解flink性能优化
java·大数据·微服务·性能优化·flink·kafka·stream
中草药z6 天前
【Stream API】高效简化集合处理
java·前端·javascript·stream·parallelstream·并行流
mask哥9 天前
详解kafka streams(二)
java·大数据·微服务·flink·kafka·stream·流式操作
上单带刀不带妹11 天前
Node.js 的流(Stream)是什么?有哪些类型?
node.js·stream·js
一叶飘零_sweeeet23 天前
从繁琐到优雅:Java Lambda 表达式全解析与实战指南
java·lambda·java8
布朗克1681 个月前
Java 8 新特性介绍
java·java8·新特性
ruan1145142 个月前
Java Lambda 类型推断详解:filter() 方法与 Predicate<? super T>
java·开发语言·spring·stream
在未来等你3 个月前
设计模式精讲 Day 7:桥接模式(Bridge Pattern)
java·java8·oop·architecture·software-design·design-patterns·bridge-pattern
叶 落3 个月前
ubuntu 安装 JDK8
java·ubuntu·jdk·安装·java8
小雨的光4 个月前
JDK8中的 Stream流式编程用法优化(工具类在文章最后)
java·stream·jdk8