开源项目SDK:http://github.com/mingyang66/spring-parent
个人文档:http://mingyang66.github.io/raccoon-docs/#/

使用Java的Stream API将实体类列表转换为Map时,你需要指定Map的键和值。例如我们有一个实体类People

package com.emily.infrastructure.test.test;

/**
 * @author :  Emily
 * @since :  2024/6/8 下午5:17
 */
public class People {
    private String name;
    private int age;

    public People(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

现在我们有一个People对象列表,你可以使用Stream API的collect方法和Collectors.toMap来转换它为一个Map:

public class TestArray {
    public static void main(String[] args) {
        List<People> list = List.of(
                new People("Emily", 18),
                new People("Emily1", 19),
                new People("Tom", 20));
        Map<String, People> data = list.stream().collect(Collectors.toMap(People::getName, p -> p));
        System.out.println(JsonUtils.toJSONString(data));
    }
}

在上面的代码中,People::getName是一个方法引用,它引用了People类的getName方法,这个方法用于提取每个People对象的name作为Map的键。p->p是一个lambda表达式,它简单地将每个People对象作为值放入Map中。

注意:如果列表中有两个或多个具有相同name的People对象,Collectors.toMap会抛出一个IllegalStateException,因为Map不允许重复的键。如果你预期会有重复的键,并且想要以某种方式合并这些值(例如,通过将他们连接成列表),你可以使用Collectors.groupingBy来达到这个目的。

如果需要处理键重复的问题,你可以使用重载的toMap方法,他接受一个合并函数来处理键冲突的情况。

    public static void main(String[] args) {
        List<People> list = List.of(
                new People("Emily", 18),
                new People("Emily", 19),
                new People("Tom", 20));
        Map<String, People> data = list.stream().collect(Collectors.toMap(People::getName, p -> p, (existing, replacement) -> existing));
        System.out.println(JsonUtils.toJSONString(data));
    }

上述案例toMap的第三个lambda控制key重复时处理的方案;existing标识如果已经存在,则会保留现有的值;如果是replacement则会覆盖现有值。如果希望保持插入的顺序可以使用toMap的另外一个重载函数:

    public static void main(String[] args) {
        List<People> list = List.of(
                new People("Emily", 18),
                new People(null, 19),
                new People("Tom", 20));
        Map<String, People> data = list.stream().collect(Collectors.toMap(People::getName, 
                p -> p, 
                (existing, replacement) -> existing,
                () -> new LinkedHashMap<>(list.size())));
        System.out.println(JsonUtils.toJSONString(data));
    }

上述案例代表会按照插入的顺序保存在Map中,使用的是LinkedHashMap;如果不指定此参数,则默认HashMap.

本站无任何商业行为
个人在线分享 » Java的Stream如何将实体类列表转换为Map
E-->