学习资料笔记

小木的学习笔记

java8 List转Map 拼接多个参数组成Key

2023-1-29 小木 Java

java8中提供了很方便的list转map的方法。之前我们可能需要写for遍历,但是现在一行代码搞定,既减少代码行数,又增加代码可读性。优雅而又高质量的代码

以下是总结的4种常见的转换,但是List<Entity> 和 List<Map>有些细微差别,见样例

新建实体类Student
package com.ly.entity;

import lombok.Data;

/**
 * 学生实体类
 * @author liaoyu
 */
@Data
public class Student {
    /**
     * 姓名
     */
    private String name;

    /**
     * 性别
     */
    private String sex;

    /**
     * 成绩
     */
    private Float grade;

    public Student(String name, String sex, Float grade) {
        this.name = name;
        this.sex = sex;
        this.grade = grade;
    }
}
初始化测试数据
List<Student> studentList = new ArrayList<>();
studentList.add(new Student("张三", "男", 87.0F));
studentList.add(new Student("李四", "男", 100.0F));
studentList.add(new Student("王五", "女", 91.0F));
studentList.add(new Student("赵六", "男", 60.0F));
List<Map<String, Object>> studentMapList = new ArrayList<>();
Map<String, Object> studentMap = new HashMap<>();
studentMap.put("name", "张三");
studentMap.put("sex", "男");
studentMap.put("grade", 87.0F);
studentMapList.add(studentMap);
studentMap.put("name", "李四");
studentMap.put("sex", "男");	
studentMap.put("grade", 100.0F);
studentMapList.add(studentMap);
studentMap.put("name", "王五");
studentMap.put("sex", "女");
studentMap.put("grade", 91.0F);
studentMapList.add(studentMap);
1、某个字段为key,某个字段为value
// 以学生成绩为例:以学生名称为key,成绩为value
// List<Entity>样例
Map<String, Float> collect1 = studentList.stream().collect(Collectors.toMap(Student::getName, Student::getGrade));
// 现有的数据,按以上的方式运行不会报错,但是如果集合对象有重复的key,会报错Duplicate key ....  可以用 (k1,k2)->k1 来设置,如果有重复的key,则保留key1,舍弃key2
studentList.add(new Student("赵六", "女", 94.0F));
// 以下两种方式都可以,下面第二种方式是针对第一种的简写
Map<String, Float> collect2 = studentList.stream().collect(Collectors.toMap(student -> student.getName(), student -> student.getGrade(), (k1, k2) -> k1));
Map<String, Float> collect3 = studentList.stream().collect(Collectors.toMap(Student::getName, Student::getGrade, (k1, k2) -> k1));

// List<Map>样例
Map<String, Float> collect4 = studentMapList.stream().collect(Collectors.toMap(s -> MapUtil.getStr(s, "name"), s -> MapUtil.getFloat(s, "grade"), (k1, k2) -> k1));


2、某个字段为key,整个对象为value
// 以学生成绩为例:以学生名称为key,成绩为value
// List<Entity>样例
Map<String, Student> collect5 = studentList.stream().collect(Collectors.toMap(Student::getName, t -> t, (k1, k2) -> k1));

// List<Map>样例
Map<String, Map<String, Object>> collect6 = studentMapList.stream().collect(Collectors.toMap(s -> MapUtil.getStr(s, "name"), t -> t, (k1, k2) -> k1));

3、联合两个字段或者更多字段为唯一key,对象为value
// 以学生成绩为例:以学生名称_性别为key,成绩为value
// List<Entity>样例
Map<String, Student> collect7 = studentList.stream().collect(Collectors.toMap(student -> student.getName() + "_" + student.getSex(), t -> t, (k1, k2) -> k1));

// List<Map>样例
Map<String, Map<String, Object>> collect8 = studentMapList.stream().collect(Collectors.toMap(s -> MapUtil.getStr(s, "name") + "_" + MapUtil.getStr(s, "sex"), t -> t, (k1, k2) -> k1));
4、获取一个字段的集合,得到List<Object>
// 获取所有学生姓名集合
// List<Entity>样例
List<String> studentNameList = studentList.stream().map(Student::getName).collect(Collectors.toList());
List<String> studentNameList2 = studentList.stream().map(p -> p.getName()).collect(Collectors.toList());

// List<Map>样例
List<String> studentNameList3 = studentMapList.stream().map(p -> MapUtil.getStr(p, "name")).collect(Collectors.toList());




标签: java8 List转Map 拼接多个参数组成Key java8 java8 List转Map java8 List转Map多个参数组成Key