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

相关推荐
ssxueyi15 小时前
Paimon 是什么?Apache Paimon简介
大数据·流数据·stream·数据湖·流批一体·apache paimon
langzitianya3 天前
RestTemplate实时接收Chunked编码传输的HTTP Response
springboot·stream·resttemplate·chunked·流式
J不A秃V头A15 天前
Stream API来提取两个字符串字段
java·stream
A Everyman24 天前
Java开发中对List<Map<String, Object>>集合去重并按大小拆分子列表
java·list·map·stream·collectors
谷大羽1 个月前
Kafka Stream实战教程
spring boot·后端·中间件·kafka·stream
爱吃土豆的程序员1 个月前
深入理解 Java 8 Stream 之 collect()
java·stream·collectors
Whitemeen太白1 个月前
Java Stream 流常用操作大全
stream
爱吃土豆的程序员2 个月前
java List<Map<String, Object>> 转 List<JSONObject> 的几种方式
java·list·stream·jsonobject·集合转换
营赢盈英4 个月前
using showdown js with openAi streaming response
开发语言·前端·javascript·stream·openai api
是枫似风4 个月前
消息驱动Stream---基于SpringCloud
java·spring boot·后端·spring·spring cloud·stream·消息分区