Grouping by Multiple Fields in Java 8
In Java 8, the Collectors.groupingBy() method is commonly used to group objects based on a specific field. However, what if you need to group by multiple fields from the same POJO?
There are several options available:
Chaining Collectors
Map<String, Map<Integer, List<Person>>> map = people .collect(Collectors.groupingBy(Person::getName, Collectors.groupingBy(Person::getAge));
This code groups the Person objects first by name and then by age, resulting in a nested map structure.
Defining a Grouping Class
class Person { record NameAge(String name, int age) { } public NameAge getNameAge() { return new NameAge(name, age); } } Map<NameAge, List<Person>> map = people.collect(Collectors.groupingBy(Person::getNameAge));
By creating a record or class that encapsulates the grouping criteria (e.g., NameAge), you can directly group by the desired fields.
Using a Pair Class
import org.apache.commons.lang3.tuple.Pair; Map<Pair<String, Integer>, List<Person>> map = people .collect(Collectors.groupingBy(p -> Pair.of(p.getName(), p.getAge())));
If you're using a third-party library, you can leverage its pair class to represent the grouping criteria.
Choosing the Best Option
The choice of approach depends on the specific requirements of your project:
The above is the detailed content of How to Group by Multiple Fields in Java 8 Using `Collectors.groupingBy()`?. For more information, please follow other related articles on the PHP Chinese website!