Java - Stream Partition Operation

Introduction

Partitioning groups data into two groups: for one group a condition is true; for the other, the same condition is false.

The partitioning condition is specified using a Predicate.

Collectors class method partitioningBy() is overloaded and it has two versions:

partitioningBy(Predicate<? super T> predicate)

partitioningBy(Predicate<? super T> predicate, 
               Collector<? super T,A,D> downstream)

partitionedBy() method returns a collector that performs the partitioning based on the specified predicate.

The values for a key are stored in a List.

If the predicate evaluates to true, the element is added to the list for the key with true value.

The following code partitions people based on whether the person is a male or not:

Map<Boolean, List<Person>> partionedByMaleGender =
        Person.persons()
              .stream()
              .collect(Collectors.partitioningBy(Person::isMale));

You can specify another collector that can perform a reduction operation on the values for each key.

The following code partitions people into male and non-male, and collects their names in a comma-separated string:

Map<Boolean,String> partionedByMaleGender =
        Person.persons()
              .stream()
              .collect(Collectors.partitioningBy(Person::isMale,
                Collectors.mapping(Person::getName, Collectors.joining(", "))));