<img src="https://img.php.cn/upload/article/001/246/273/175152816538744.jpg" alt="使用 java 8 stream api 将 list 转换为 map”>” />
本文将指导你如何使用 Java 8 Stream API 将 List 转换为 Map<String, List>。 这种转换在处理具有嵌套结构的数据时非常有用,例如当我们需要根据嵌套对象的属性对外部对象进行分组时。
使用 Stream API 进行转换
假设我们有以下两个领域类:Trip 和 Employee。
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;}
import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@NoArgsConstructor@AllArgsConstructorpublic class Employee { private String name; private String empId;}
我们的目标是将一个 List 转换为 Map<String, List>,其中 Map 的 Key 是 Employee 对象的 empId,Value 是包含该 Employee 参与的所有 Trip 对象的列表。
为了实现这个目标,我们需要使用 Stream API 中的 flatMap 和 groupingBy 操作。flatMap 用于将一个 Stream 中的每个元素转换为另一个 Stream,并将所有生成的 Stream 连接成一个 Stream。groupingBy 用于将 Stream 中的元素按照指定的条件进行分组。
立即学习“Java免费学习笔记(深入)”;
首先,我们需要创建一个辅助类,用于保存 Employee 的 empId 和对应的 Trip 对象。 在 Java 16 及以上版本,可以使用 record 来简化这个过程。
public record TripEmployee(String empId, Trip trip) {}
对于Java 8,可以使用如下的class来实现同样的功能:
import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;@Data@NoArgsConstructor@AllArgsConstructorclass TripEmployee { private String empId; private Trip trip;}
接下来,我们可以使用以下代码将 List 转换为 Map<String, List>:
import java.util.ArrayList;import java.util.List;import java.util.Map;import java.util.stream.Collectors;public class TripConverter { public static Map<String, List> convertTripsToEmployeeMap(List trips) { return 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()) )); } public static void main(String[] args) { // 创建一些示例数据 List employees1 = new ArrayList(); employees1.add(new Employee("Alice", "1")); employees1.add(new Employee("Bob", "2")); List employees2 = new ArrayList(); employees2.add(new Employee("Charlie", "3")); employees2.add(new Employee("Alice", "1")); Trip trip1 = new Trip(new java.util.Date(), new java.util.Date(), employees1); Trip trip2 = new Trip(new java.util.Date(), new java.util.Date(), employees2); List trips = new ArrayList(); trips.add(trip1); trips.add(trip2); // 进行转换 Map<String, List> employeeTripMap = convertTripsToEmployeeMap(trips); // 打印结果 employeeTripMap.forEach((empId, tripList) -> { System.out.println("Employee ID: " + empId); tripList.forEach(trip -> System.out.println(" Trip: " + trip)); }); }}
这段代码首先使用 flatMap 将每个 Trip 对象转换为一个 Stream,其中每个 TripEmployee 对象包含一个 Employee 的 empId 和对应的 Trip 对象。然后,使用 groupingBy 将 TripEmployee 对象按照 empId 进行分组,并将每个 empId 对应的 Trip 对象收集到一个列表中。
代码解释
trips.stream(): 将 List 转换为一个 Stream。flatMap(trip -> trip.getEmpList().stream().map(emp -> new TripEmployee(emp.getEmpId(), trip))): 对于 Stream 中的每个 Trip 对象,获取其 empList,将其转换为一个 Stream,并将每个 Employee 对象映射为一个 TripEmployee 对象。flatMap 将所有生成的 Stream 连接成一个 Stream。collect(Collectors.groupingBy(TripEmployee::empId, Collectors.mapping(TripEmployee::trip, Collectors.toList()))): 使用 groupingBy 将 TripEmployee 对象按照 empId 进行分组。Collectors.mapping 用于将每个 empId 对应的 TripEmployee 对象映射为 Trip 对象,并使用 Collectors.toList() 将所有 Trip 对象收集到一个列表中。
注意事项
确保 Trip 类的 getEmpList() 方法返回的 List 不为 null,否则可能会导致 NullPointerException。如果 Employee 类的 getEmpId() 方法返回 null 或空字符串,可能会导致 groupingBy 的结果出现问题。建议在代码中进行空值或空字符串的检查。record 是 Java 16 引入的特性,如果你的项目使用的是 Java 8,你需要使用 class 来代替 record。
总结
本文介绍了如何使用 Java 8 Stream API 将一个 Trip 对象的列表转换为一个 Map<String, List>,其中 Map 的 Key 是员工 ID,Value 是包含该员工参与的所有 Trip 对象的列表。通过使用 flatMap 和 groupingBy 组合的 Stream 操作,我们可以简洁而高效地实现这种转换。这种方法在处理具有嵌套结构的数据时非常有用,可以帮助我们更好地组织和分析数据。
以上就是使用 Java 8 Stream API 将 List 转换为 Map的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/150720.html
微信扫一扫
支付宝扫一扫