news 2026/1/17 12:07:12

java list怎么进行group

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
java list怎么进行group

在Java中,对List进行分组有多种方法,以下是常见的几种方式:

1. 使用 Stream API (Java 8+ 推荐)

1.1 按属性分组

// 按对象属性分组 List<Person> people = Arrays.asList( new Person("Alice", "IT"), new Person("Bob", "HR"), new Person("Charlie", "IT") ); Map<String, List<Person>> byDept = people.stream() .collect(Collectors.groupingBy(Person::getDepartment)); // 复杂分组:按多个条件分组 Map<String, Map<Integer, List<Person>>> byDeptAndAge = people.stream() .collect(Collectors.groupingBy( Person::getDepartment, Collectors.groupingBy(Person::getAge) ));

1.2 分组后处理

// 分组并计数 Map<String, Long> countByDept = people.stream() .collect(Collectors.groupingBy( Person::getDepartment, Collectors.counting() )); // 分组并求和 Map<String, Integer> sumByDept = people.stream() .collect(Collectors.groupingBy( Person::getDepartment, Collectors.summingInt(Person::getSalary) )); // 分组后获取最大/最小值 Map<String, Optional<Person>> maxByDept = people.stream() .collect(Collectors.groupingBy( Person::getDepartment, Collectors.maxBy(Comparator.comparing(Person::getSalary)) ));

2. 使用传统循环

Map<String, List<Person>> 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' MultiValuedMap<String, 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' Multimap<String, Person> byDept = ArrayListMultimap.create(); for (Person person : people) { byDept.put(person.getDepartment(), person); } // 或者使用流式方式 ImmutableListMultimap<String, 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) { List<Person> 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. 按部门分组 Map<String, List<Person>> byDept = people.stream() .collect(Collectors.groupingBy(Person::getDepartment)); // 2. 按部门统计平均工资 Map<String, Double> avgSalaryByDept = people.stream() .collect(Collectors.groupingBy( Person::getDepartment, Collectors.averagingDouble(Person::getSalary) )); // 3. 按年龄段分组 Map<String, List<Person>> byAgeGroup = people.stream() .collect(Collectors.groupingBy(p -> { if (p.getAge() < 30) return "青年"; else if (p.getAge() < 40) return "中年"; else return "资深"; })); } }

5. 自定义分组逻辑

// 自定义分组器 Collector<Person, ?, Map<String, List<Person>>> 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; } ); Map<String, List<Person>> customGrouped = people.stream() .collect(customGrouping);

选择建议:

  1. Java 8+:优先使用Stream API+Collectors.groupingBy(),代码简洁高效

  2. 复杂分组:使用多级分组或自定义分组逻辑

  3. 并行处理:考虑使用并行流parallelStream()

  4. 性能考虑:大数据量时注意选择合适的 Map 实现(如 LinkedHashMap 保持顺序)

这些方法可以根据具体需求灵活选择和使用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/17 6:04:10

鸣潮工具箱3大隐藏玩法揭秘:让你的游戏体验直线飙升!

鸣潮工具箱3大隐藏玩法揭秘&#xff1a;让你的游戏体验直线飙升&#xff01; 【免费下载链接】WaveTools &#x1f9f0;鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 你知道吗&#xff1f;大多数玩家只用了鸣潮工具箱不到30%的功能&#xff01;今…

作者头像 李华
网站建设 2026/1/17 7:47:41

游戏数据导出革命:3步解锁自动化脚本的统计分析能力

游戏数据导出革命&#xff1a;3步解锁自动化脚本的统计分析能力 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研&#xff0c;全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 还在为繁琐的…

作者头像 李华
网站建设 2026/1/16 4:18:29

嘉立创EDA画PCB教程:从无到有的第一个完整示例

从零开始画PCB&#xff1a;我在嘉立创EDA上点亮第一颗LED的全过程 你有没有过这样的经历&#xff1f; 想做个简单的电路&#xff0c;比如让一个LED闪烁&#xff0c;结果发现——连从哪里开始都不知道。买开发板太贵、改现成模块又不够灵活。直到我听说了 嘉立创EDA &#x…

作者头像 李华
网站建设 2026/1/12 6:08:37

AEUX终极指南:3步实现设计到动画的无缝转换

AEUX终极指南&#xff1a;3步实现设计到动画的无缝转换 【免费下载链接】AEUX Editable After Effects layers from Sketch artboards 项目地址: https://gitcode.com/gh_mirrors/ae/AEUX AEUX作为设计师与动画师之间的终极协作桥梁&#xff0c;彻底解决了设计稿到动画制…

作者头像 李华
网站建设 2026/1/10 12:57:16

5款高效AEUX替代工具:重新定义设计到动画工作流

5款高效AEUX替代工具&#xff1a;重新定义设计到动画工作流 【免费下载链接】AEUX Editable After Effects layers from Sketch artboards 项目地址: https://gitcode.com/gh_mirrors/ae/AEUX 当我们谈论AEUX插件时&#xff0c;我们实际上在探讨如何将静态设计无缝转换为…

作者头像 李华
网站建设 2026/1/14 15:54:24

【无人机通信】无人机辅助覆盖增强蜂窝网络性能研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码获取及仿…

作者头像 李华