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! :)