Java8如何将List<Person>转换为按grade分组的Map<Integer, List<Person>>
按Person的grade属性分组为Map<Integer, List>的实现方案
嘿,这需求其实挺常见的,我给你两种实用的实现方式,你可以根据项目的Java版本来选:
一、Java 8+ 推荐:Stream API 一行搞定
这是最简洁优雅的方式,利用Java 8引入的Stream和Collectors工具类,几行代码就能完成分组:
首先先补全你的Person类定义(假设你还没写全):
class Person { private String name; private Integer grade; // 构造器、getter/setter 省略,这里给出关键的getGrade方法 public Integer getGrade() { return grade; } public void setGrade(Integer grade) { this.grade = grade; } public void setName(String name) { this.name = name; } }
然后在你的PersonMain类里完成分组:
import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class PersonMain { public static void main(String[] args) { Person person1 = new Person(); person1.setName("Alice"); person1.setGrade(1); Person person2 = new Person(); person2.setName("Bob"); person2.setGrade(2); Person person3 = new Person(); person3.setName("Charlie"); person3.setGrade(1); List<Person> personList = new ArrayList<>(); personList.add(person1); personList.add(person2); personList.add(person3); // 核心分组代码 Map<Integer, List<Person>> gradePersonMap = personList.stream() .collect(Collectors.groupingBy(Person::getGrade)); // 测试输出 gradePersonMap.forEach((grade, persons) -> { System.out.println("年级:" + grade); persons.forEach(p -> System.out.println(" 姓名:" + p.getName())); }); } }
这里Collectors.groupingBy(Person::getGrade)会自动帮你把相同grade的Person对象归集到同一个List里,键就是对应的grade值,完全符合你的需求。
如果你的grade可能为null,可以加个兜底处理避免空指针:
Map<Integer, List<Person>> gradePersonMap = personList.stream() .collect(Collectors.groupingBy(p -> p.getGrade() == null ? 0 : p.getGrade()));
这里把null的grade映射为0,你也可以改成其他适合的默认值。
二、传统循环方式(兼容Java 7及以下)
如果你的项目还在用Java 7或者更低版本,用普通循环也能实现:
import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class PersonMain { public static void main(String[] args) { // 初始化Person列表的代码和上面一样,省略... Map<Integer, List<Person>> gradePersonMap = new HashMap<>(); for (Person person : personList) { Integer grade = person.getGrade(); // 如果当前grade还没有对应的List,就新建一个 if (!gradePersonMap.containsKey(grade)) { gradePersonMap.put(grade, new ArrayList<>()); } // 把当前Person加到对应的List里 gradePersonMap.get(grade).add(person); } // 测试输出和上面一样,省略... } }
这种方式逻辑清晰,容易理解,适合需要兼容旧版本的场景。
两种方式都能完美实现你的分组需求,选哪种就看你的项目环境啦!
内容的提问来源于stack exchange,提问作者opuser1
相关产品推荐
相关产品推荐

