开源项目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.