2026/6/9 12:10:04
网站建设
项目流程
响应式网站模板之家,网站制作论文总结,办公室设计公司,微信app在Java中#xff0c;对List进行分组有多种方法#xff0c;以下是常见的几种方式#xff1a;
1. 使用 Stream API (Java 8 推荐)
1.1 按属性分组
// 按对象属性分组
ListPerson people Arrays.asList(new Person(Alice, IT),new Person(…在Java中对List进行分组有多种方法以下是常见的几种方式1. 使用 Stream API (Java 8 推荐)1.1 按属性分组// 按对象属性分组 ListPerson people Arrays.asList( new Person(Alice, IT), new Person(Bob, HR), new Person(Charlie, IT) ); MapString, ListPerson byDept people.stream() .collect(Collectors.groupingBy(Person::getDepartment)); // 复杂分组按多个条件分组 MapString, MapInteger, ListPerson byDeptAndAge people.stream() .collect(Collectors.groupingBy( Person::getDepartment, Collectors.groupingBy(Person::getAge) ));1.2 分组后处理// 分组并计数 MapString, Long countByDept people.stream() .collect(Collectors.groupingBy( Person::getDepartment, Collectors.counting() )); // 分组并求和 MapString, Integer sumByDept people.stream() .collect(Collectors.groupingBy( Person::getDepartment, Collectors.summingInt(Person::getSalary) )); // 分组后获取最大/最小值 MapString, OptionalPerson maxByDept people.stream() .collect(Collectors.groupingBy( Person::getDepartment, Collectors.maxBy(Comparator.comparing(Person::getSalary)) ));2. 使用传统循环MapString, ListPerson byDept new HashMap(); for (Person person : people) { String dept person.getDepartment(); byDept.computeIfAbsent(dept, k - new ArrayList()) .add(person); }3. 使用第三方库3.1 Apache Commons Collections// 添加依赖 // implementation org.apache.commons:commons-collections4:4.4 MultiValuedMapString, Person byDept new ArrayListValuedHashMap(); for (Person person : people) { byDept.put(person.getDepartment(), person); }3.2 Google Guava// 添加依赖 // implementation com.google.guava:guava:31.1-jre MultimapString, Person byDept ArrayListMultimap.create(); for (Person person : people) { byDept.put(person.getDepartment(), person); } // 或者使用流式方式 ImmutableListMultimapString, Person grouped Multimaps.index( people, Person::getDepartment );4. 完整示例import java.util.*; import java.util.stream.Collectors; class Person { private String name; private String department; private int age; private int salary; // 构造方法、getter、setter public static void main(String[] args) { ListPerson people Arrays.asList( new Person(Alice, IT, 25, 5000), new Person(Bob, HR, 30, 4500), new Person(Charlie, IT, 28, 5500), new Person(David, HR, 35, 4800) ); // 1. 按部门分组 MapString, ListPerson byDept people.stream() .collect(Collectors.groupingBy(Person::getDepartment)); // 2. 按部门统计平均工资 MapString, Double avgSalaryByDept people.stream() .collect(Collectors.groupingBy( Person::getDepartment, Collectors.averagingDouble(Person::getSalary) )); // 3. 按年龄段分组 MapString, ListPerson byAgeGroup people.stream() .collect(Collectors.groupingBy(p - { if (p.getAge() 30) return 青年; else if (p.getAge() 40) return 中年; else return 资深; })); } }5. 自定义分组逻辑// 自定义分组器 CollectorPerson, ?, MapString, ListPerson customGrouping Collector.of( HashMap::new, // 供应者 (map, person) - { // 累加器 String key person.getDepartment() - (person.getAge() / 10 * 10); // 按10岁分段 map.computeIfAbsent(key, k - new ArrayList()) .add(person); }, (map1, map2) - { // 合并器用于并行流 map2.forEach((key, value) - map1.merge(key, value, (list1, list2) - { list1.addAll(list2); return list1; }) ); return map1; } ); MapString, ListPerson customGrouped people.stream() .collect(customGrouping);选择建议Java 8优先使用Stream APICollectors.groupingBy()代码简洁高效复杂分组使用多级分组或自定义分组逻辑并行处理考虑使用并行流parallelStream()性能考虑大数据量时注意选择合适的 Map 实现如 LinkedHashMap 保持顺序这些方法可以根据具体需求灵活选择和使用。