<img src="https://img.php.cn/upload/article/001/246/273/175152818970402.jpg" alt="使用java 8 stream api将list转换为map”>” />
本文介绍了如何使用Java 8 Stream API将一个包含Trip对象的List转换为Map,其中Map的键是Employee的empId,值是包含该Employee的Trip对象列表。文章详细解释了如何使用flatMap和groupingBy Collectors来实现这一转换,并提供了完整的代码示例。
在实际开发中,经常会遇到需要根据嵌套对象的属性对集合进行分组的需求。例如,我们有一个包含Trip对象的列表,每个Trip对象包含一个Employee列表,我们希望将所有Trip对象按照Employee的empId进行分组,生成一个Map。
Java 8 Stream API提供了强大的数据处理能力,可以简洁高效地实现这一需求。
实体类定义
首先,我们定义两个实体类:Trip 和 Employee。
立即学习“Java免费学习笔记(深入)”;
import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import java.util.Date;import java.util.List;@Data@NoArgsConstructor@AllArgsConstructorpublic class Trip { private Date startTime; private Date endTime; List empList;}@Data@NoArgsConstructor@AllArgsConstructorpublic class Employee { private String name; private String empId;}
使用Stream API进行转换
核心在于使用 flatMap 和 groupingBy Collectors。flatMap 用于将 Stream 转换为 Stream,其中 TripEmployee 是一个辅助类,用于保存 empId 和 Trip 实例的引用。groupingBy 用于根据 empId 对 Trip 对象进行分组。
如果使用的是 Java 16 或更高版本,可以使用 record 来简化 TripEmployee 的定义:
public record TripEmployee(String empId, Trip trip) {}
如果使用的是 Java 8,则需要使用普通的 class 来定义 TripEmployee。
完整的代码示例如下:
import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.Map;import java.util.stream.Collectors;public class TripGrouping { public record TripEmployee(String empId, Trip trip) {} public static void main(String[] args) { // 示例数据 List trips = new ArrayList(); List empList1 = List.of(new Employee("Alice", "101"), new Employee("Bob", "102")); List empList2 = List.of(new Employee("Charlie", "103"), new Employee("David", "101")); trips.add(new Trip(new Date(), new Date(), empList1)); trips.add(new Trip(new Date(), new Date(), empList2)); // 使用 Stream API 进行转换 Map<String, List> empMap = trips.stream() .flatMap(trip -> trip.getEmpList().stream() .map(emp -> new TripEmployee(emp.getEmpId(), trip)) ) .collect(Collectors.groupingBy( TripEmployee::empId, Collectors.mapping(TripEmployee::trip, Collectors.toList()) )); // 打印结果 System.out.println(empMap); }}
代码解释:
trips.stream(): 将 List 转换为 Stream。flatMap(trip -> trip.getEmpList().stream().map(emp -> new TripEmployee(emp.getEmpId(), trip))):trip.getEmpList().stream(): 获取每个 Trip 对象的 Employee 列表,并将其转换为 Stream。map(emp -> new TripEmployee(emp.getEmpId(), trip)): 将每个 Employee 对象转换为 TripEmployee 对象,其中包含 empId 和 Trip 对象的引用。flatMap(): 将所有 Stream 对象合并为一个 Stream。collect(Collectors.groupingBy(TripEmployee::empId, Collectors.mapping(TripEmployee::trip, Collectors.toList()))):groupingBy(TripEmployee::empId): 根据 TripEmployee 对象的 empId 进行分组。mapping(TripEmployee::trip, Collectors.toList()): 将每个分组中的 TripEmployee 对象转换为 Trip 对象,并将所有 Trip 对象收集到一个 List 中。
注意事项
如果 Employee 列表为空,则不会生成任何 TripEmployee 对象。如果多个 Employee 对象具有相同的 empId,则它们对应的 Trip 对象将出现在同一个 List 中。确保正确导入所需的类和包,例如 java.util.stream.Collectors。
总结
本文介绍了如何使用Java 8 Stream API将一个包含Trip对象的List转换为Map。通过使用 flatMap 和 groupingBy Collectors,我们可以简洁高效地实现这一转换。这种方法可以应用于各种需要根据嵌套对象的属性对集合进行分组的场景。 熟悉并掌握 Stream API 的使用,可以显著提高 Java 开发的效率和代码的可读性。
以上就是使用Java 8 Stream API将List转换为Map的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/150666.html
微信扫一扫
支付宝扫一扫