Group by field name in Java

I'm trying to group Java objects by their field, i.e Person.java

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

So if I have n Person objects, what would be the easiest way to get all people name "David" into a map like Map<String, List<Person>> map;?

I found this on Google (but it doesn't compile), it seems to be the thing I'm looking for: http://www.anzaan.com/2010/06/grouping-objects-using-objects-property/


Solution 1:

There's probably a library that can do this more simply, but it's not too hard to do it manually:

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");

Solution 2:

Using java-8 with the Collectors class and streams, you can do this:

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

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

Here I used getOrDefault so that you get an empty immutable list instead of a null reference if there is no "David" in the original list, but you can use get if you prefer to have a null value.

Hope it helps! :)