Home > database >  Is it possible to chain multiple partitionBy?
Is it possible to chain multiple partitionBy?

Time:10-08

I have a record Person as below:

public record Person(boolean male, int age) {}

And I want to split a List of Person into 4 different lists: males over 18, males under 18 and the same for females, what I have so far is:

Map<Boolean, List<Person>> peopleDividedBySex = people.stream()
        .collect(Collectors.partitioningBy(Person::male));
List<Person> males = peopleDividedBySex.get(Boolean.TRUE);
List<Person> females = peopleDividedBySex.get(Boolean.FALSE);
Map<Boolean, List<Person>> malesDividedByAge = males.stream()
        .collect(Collectors.partitioningBy(person -> person.age() > 18));
List<Person> malesOverEighteen = malesDividedByAge.get(Boolean.TRUE);
List<Person> malesUnderEighteen = malesDividedByAge.get(Boolean.FALSE);
Map<Boolean, List<Person>> femalesDividedByAge = males.stream()
        .collect(Collectors.partitioningBy(person -> person.age() > 18));
List<Person> femalesOverEighteen = femalesDividedByAge.get(Boolean.TRUE);
List<Person> femalesUnderEighteen = femalesDividedByAge.get(Boolean.FALSE);

Is it possible to do it in one chainable partitioningBy method in order to avoid creating the other streams?

CodePudding user response:

You can partition with another downstream partition collector:

Map<Boolean, Map<Boolean, List<Person>>> partitioned = persons.stream()
        .collect(partitioningBy(Person::male, partitioningBy(p -> p.age() < 18)));

List<Person> malesUnder18 = partitioned.get(true).get(true);
List<Person> malesOver18 = partitioned.get(true).get(false);
List<Person> femalesUnder18 = partitioned.get(false).get(true);
List<Person> femalesOver18 = partitioned.get(false).get(false);
  •  Tags:  
  • java
  • Related