list转map的三种方法 list的stream转map
" /gt;
本文介绍了如何使用Java 8 Stream API将一个包含Trip对象的List转换为Mapgt;,其中Map的键是Employee的empId,值是包含该Employee的Trip对象列表。文章详细解释了如何使用flatMap和groupingBy收集器来实现这个转换,并提供了完整的代码示例。
在实际开发中,经常会遇到需要根据查询对象的属性对集合进行分组的需求。例如,我们有一个包含Trip对象的列表,每个Trip对象包含一个Employee列表,我们希望将所有Trip对象按照Employee的empId进行分组,生成一个Mapgt;。
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; Listlt;Employeegt; 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 或更高版本,可以使用记录来简化 TripEmployee 的定义:公共记录 TripEmployee(String empId, Trip trip) {}登录后复制
如果使用 Java 的话8、则需要使用普通的类 来定义 TripEmployee。
完整的代码示例如下:导入 java.util.ArrayList;导入 java.util.Date;导入 java.util.List;导入 java.util.Map;导入 java.util.stream.Collectors;public class TripGrouping { public record TripEmployee(String empId, Trip trip) {} public static void main(String[] args) { //示例数据 Listlt;Tripgt; trips = new ArrayListlt;gt;(); Listlt;Employeegt; empList1 = List.of(new Employee(quot;Alicequot;, quot;101quot;), new Employee(quot;Bobquot;, quot;102quot;)); Listlt;Employeegt; empList2 = List.of(new Employee(quot;Charliequot;, quot;103quot;), new Employee(quot;Davidquot;, quot;101quot;)); trips.add(new Trip(new Date(), new Date(), empList1)); trips.add(new Trip(new Date(), new Date(), empList2)); // 使用 Stream API 进行转换 Maplt;String, Listlt;Tripgt;gt; empMap = trips.stream() .flatMap(trip -gt; trip.getEmpList().stream() .map(emp -gt; 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 -gt; trip.getEmpList().stream().map(emp -gt; new TripEmployee(emp.getEmpId(), trip))):转换.getEmpList().stream():获取每个 Trip 对象的 Employee 列表,把其转换为 Stream。map(emp -gt; 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 为 Mapgt;。通过使用 flatMap 和 groupingBy收藏家们,我们可以简单高效地实现这一转换。方法可以查找各种需要根据请求对象的属性对集合进行分组的场景。熟悉并掌握 Stream API 的使用,可以显着提高 Java 开发的效率和代码的可靠性。
以上就是使用 Java 8 Stream API 将 List 转换为 Maplt;String,Listgt;的详细,更多内容请关注乐哥常识网其他相关文章!