Java 8中使用groupBy()按name与id双重分组Person对象
实现Person列表按name和id层级分组
要实现按name分组后再按id细分的需求,直接使用**嵌套的Collectors.groupingBy**即可完成,最终得到Map<String, Map<Integer, List<Person>>>的结构。
修改后的代码
import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import static java.util.stream.Collectors.groupingBy; public class Main { public static void main(String[] args) { Person person1 = new Person(1, "John", 4); Person person2 = new Person(2, "John", 3); Person person3 = new Person(2, "John", 4); List<Person> personList = new ArrayList<>(); personList.add(person1); personList.add(person2); personList.add(person3); // 嵌套分组:先按name分组,再按id分组 Map<String, Map<Integer, List<Person>>> personByNameAndId = personList.stream() .collect(groupingBy(Person::getName, groupingBy(Person::getId))); System.out.println(personByNameAndId); } } // 补充完整Person类(包含构造器、getter和toString方法) class Person { private int id; private String name; private int score; public Person(int id, String name, int score) { this.id = id; this.name = name; this.score = score; } public int getId() { return id; } public String getName() { return name; } public int getScore() { return score; } @Override public String toString() { return "Person{id=" + id + ", name='" + name + "', score=" + score + "}"; } }
预期输出
{John={1=[Person{id=1, name='John', score=4}], 2=[Person{id=2, name='John', score=3}, Person{id=2, name='John', score=4}]}}
代码说明
- 外层
groupingBy(Person::getName)负责将所有Person按name分成第一级分组; - 内层
groupingBy(Person::getId)作为第二个参数传入,将每个name分组下的Person再按id进行二次分组; - 最终结构中,同一个name下不同id的Person会被分到独立的列表中,完全符合需求。
内容的提问来源于stack exchange,提问作者Dattq2303
相关产品推荐
相关产品推荐

