在 Java 中按字段名称分组

2022-09-02 22:47:32

我正在尝试按字段(即 Person)对 Java 对象进行分组.java

public class Person {
    String name;
    String surname;
    ....
}

因此,如果我有n个Person对象,那么将所有人的名字“David”放入地图中的最简单方法是什么?Map<String, List<Person>> map;

我在Google上找到了这个(但它没有编译),它似乎是我正在寻找的东西:http://www.anzaan.com/2010/06/grouping-objects-using-objects-property/


答案 1

可能有一个库可以更简单地做到这一点,但是手动完成它并不难:

List<Person> allPeople; // your list of all people
Map<String, List<Person>> map = new HashMap<String, List<Person>>();
for (Person person : allPeople) {
   String key = person.getName();
   if (map.get(key) == null) {
      map.put(key, new ArrayList<Person>());
   }
   map.get(key).add(person);
}

List<Person> davids = map.get("David");

答案 2

收集器类和流结合使用,可以执行以下操作:

Map<String, List<Person>> mapByName = 
    allPeople.stream().collect(Collectors.groupingBy(Person::getName));

List<Person> allDavids = mapByName.getOrDefault("David", Collections.emptyList());

在这里,我使用了这样一个空的不可变列表,而不是一个引用,如果原始列表中没有“David”,但如果你更喜欢有一个值,你可以使用。getOrDefaultnullgetnull

希望它有帮助!:)