使用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));

相关推荐
彩虹、1 天前
数据处理常用到的一些Java 8中Stream操作
stream·java 8
程序员三明治4 天前
选 Redis Stream 还是传统 MQ?队列选型全攻略(适用场景、优缺点与实践建议)
java·redis·后端·缓存·rocketmq·stream·队列
花伤情犹在17 天前
Java Stream 高级应用:优雅地扁平化(FlatMap)递归树形结构数据
java·stream·function·flatmap
sg_knight1 个月前
Spring Cloud与RabbitMQ深度集成:从入门到生产级实战
java·spring boot·spring·spring cloud·消息队列·rabbitmq·stream
DN金猿1 个月前
java8提取list中对象有相同属性值的对象或属性值
java·list·stream·java8
mask哥2 个月前
详解flink性能优化
java·大数据·微服务·性能优化·flink·kafka·stream
中草药z2 个月前
【Stream API】高效简化集合处理
java·前端·javascript·stream·parallelstream·并行流
mask哥2 个月前
详解kafka streams(二)
java·大数据·微服务·flink·kafka·stream·流式操作
上单带刀不带妹2 个月前
Node.js 的流(Stream)是什么?有哪些类型?
node.js·stream·js
一叶飘零_sweeeet3 个月前
从繁琐到优雅:Java Lambda 表达式全解析与实战指南
java·lambda·java8