The elements from a Stream can be paritioned using Collectors.partitioningBy and a condition.
Map<Boolean, List<Object>> map = stream.collect( Collectors.partitioningBy(s -> s.condition ) );
In the following code, a Stream of Object Student is created. The Student class has a name and a Grade variables. The stream is partitions depending on the grade of the Student. The collect method is called using Collectors.partitioningBy, Lambda is used to generate the condition. Here it is a grade >= to 80. The output map contains 2 entries one for the Objects passing the condition and the others.
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class LambdaStreamPartitionBy {
public static void main(String[] argv){
// Create the Stream
Stream<Student> stream = Stream.of( new Student("a", 70), new Student("c", 80), new Student("a",90), new Student("b",100), new Student("b", 65) );
// Partition the Elements
Map<Boolean, List<Student>> map = stream.collect( Collectors.partitioningBy(s -> s.getGrade() >= 80 ) );
// Display the output
System.out.println( "Produced Map: " + map );
System.out.println( "Student with passing Grade: " + map.get( Boolean.TRUE ) );
}
static class Student {
Student(String n, int w){
name = n;
grade = w;
}
String name;
int grade;
public String getName(){
return name;
}
public int getGrade(){
return grade;
}
public String toString(){
return name;
}
}
}
Produced Map: {false=[a, b], true=[c, a, b]}
Student with passing Grade: [c, a, b]