In this tutorial we’ll see examples of Collectors.partitioningBy()
method which is part of the Collectors
class in the Java Stream API.
Collectors.partitioningBy() method partitions the input elements according to a passed Predicate (which defines the condition for partitioning), and organizes them into a Map<Boolean, List> with values assigned to two keys "false" and "true" based on whether the input element passes the condition or not.
There are two overloaded Collectors.partitioningBy() methods-
1. Collector<T,?,Map<Boolean, List<T>>> partitioningBy(Predicate<? super T> predicate)- Partitions the input elements according to the passed Predicate.
2. Collector<T,?,Map<Boolean, D>> partitioningBy(Predicate<? super T> predicate, Collector<? super T,A,D> downstream)- In this method along with a Predicate another Collector is also passed as an argument that reduces the values in each partition, and organizes them into a Map<Boolean, D> whose values are the result of the downstream reduction.
Collectors.partitioningBy() Java examples
1. In this simple example we’ll use the partitioningBy() method to partition the list of integers into a map of even and odd numbers.
import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.stream.Collectors; public class PartitioningDemo { public static void main(String[] args) { List<Integer> listOfNumbers = Arrays.asList(10, 25, 9, 87, 56, 2, 31); Map<Boolean, List<Integer>> numbers = listOfNumbers.stream() .collect(Collectors.partitioningBy(n -> n%2 == 0)); // false key - returns list with odd numbers System.out.println("Odd Numbers- " + numbers.get(false)); // true key - returns list with even numbers System.out.println("Even Numbers- " + numbers.get(true)); } }Output
Odd Numbers- [25, 9, 87, 31] Even Numbers- [10, 56, 2]
In the example n -> n%2 == 0
is an implementation of the Predicate functional interface using lambda expression.
2. Partition a list of Students into those who are studying science and those who are not.
Student class used is as given belowpublic class Student { private int rollNo; private String name; private String stream; private int marks; Student(int rollNo, String name, String stream, int marks){ this.rollNo = rollNo; this.name = name; this.stream = stream; this.marks = marks; } public int getRollNo() { return rollNo; } public void setRollNo(int rollNo) { this.rollNo = rollNo; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getStream() { return stream; } public void setStream(String stream) { this.stream = stream; } public int getMarks() { return marks; } public void setMarks(int marks) { this.marks = marks; } @Override public String toString() { return "Roll Number: " + getRollNo() + " Name: " + getName(); } }
public class PartitioningDemo { public static void main(String[] args) { List<Student> studentList = Arrays.asList(new Student(1, "Peter", "Science", 75), new Student(2, "Ram", "Science", 99), new Student(3, "Priscilla", "Art", 68), new Student(4, "Mahesh", "Art", 62), new Student(5, "Scott", "Commerce", 72)); // List with resulting elements Map<Boolean, List<Student>> numbers = studentList.stream() .collect(Collectors.partitioningBy(s -> s.getStream().equals("Science"))); System.out.println("In Science stream- " + numbers.get(true)); System.out.println("Not in Science stream- " + numbers.get(false)); } }Output
In Science stream- [Roll Number: 1 Name: Peter, Roll Number: 2 Name: Ram] Not in Science stream- [Roll Number: 3 Name: Priscilla, Roll Number: 4 Name: Mahesh, Roll Number: 5 Name: Scott]
3. Using the partitioningBy() method with two arguments. If you want to get the count of students studying science and those who are not then you can pass Collectors.counting() as the second argument.
public class PartitioningDemo { public static void main(String[] args) { List<Student> studentList = Arrays.asList(new Student(1, "Peter", "Science", 75), new Student(2, "Ram", "Science", 99), new Student(3, "Priscilla", "Art", 68), new Student(4, "Mahesh", "Art", 62), new Student(5, "Scott", "Commerce", 72)); Map<Boolean, Long> numbers = studentList.stream() .collect(Collectors.partitioningBy(s -> s.getStream().equals("Science"), Collectors.counting())); System.out.println("Count of students in Science stream- " + numbers.get(true)); System.out.println("Count of students not in Science stream- " + numbers.get(false)); } }Output
Count of students in Science stream- 2 Count of students not in Science stream- 3
That's all for the topic Java Stream Collectors.partitioningBy() Examples. If something is missing or you have something to share about the topic please write a comment.
You may also like
- Java Stream Collectors.groupingBy() Examples
- Java Stream filter() With Examples
- Java Callable And Future With Examples
- Thread Priority in Java With Examples
- Checked Vs Unchecked Exception in Java
- Convert HTML to PDF in Java Using Flying Saucer, OpenPDF
- Spring Boot Example Using Spring Tool Suite (STS)
- Tic-Tac-Toe Game in Python
No comments:
Post a Comment