What is Collectors.mapping() in Java?
What is the Collectors class?
Collectors is a utility class that provides various implementations of reduction operations. These include grouping elements, collecting them to different collections, summarizing them according to various criteria, etc. The different functionalities in the Collectors class are usually used as the final operation on streams.
The mapping() method
mapping() is a static method of the Collectors class that returns a Collector. It converts a Collector accepting elements of one type to a Collector that accepts elements of another type.
This method is generally used in multi-level reduction operations. For example, if we are given a list of persons with their name and age, we can get the list of ages for each different name.
The mapping method is defined in the Collectors class. The Collectors class is defined in the java.util.stream package. To import the Collectors class, check the following import statement:
import java.util.stream.Collectors;
Syntax
public static <T, U, A, R> Collector<T, ?, R> mapping(Function<? super T, ? extends U> mapper, Collector<? super U, A, R> downstream)
Parameters
Function<? super T, ? extends U> mapper: The mapping function to convert elements of theUtype to theTtype.Collector<? super U, A, R> downstream: The collector to apply on the result of the mapping.
Return value
This method returns a collector that applies the mapping function to the input items. It then passes the mapped results to the downstream collection.
Code
import java.util.Arrays;import java.util.List;import java.util.Map;import java.util.stream.Collectors;import java.util.stream.Stream;public class Main {static class Person{String name;int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +'}';}}public static void main(String[] args) {List<Person> personList = Arrays.asList(new Person("bob", 34), new Person("bob", 43),new Person("mary", 84), new Person("john", 12), new Person("bob", 22));System.out.println("Person list - " + personList);Stream<Person> personStream = personList.stream();Map<String, List<Integer>> result = personStream.collect(Collectors.groupingBy(p -> p.name,Collectors.mapping(e -> e.age, Collectors.toList())));System.out.println("Mapping result - " + result);}}
Explanation
- Lines 1-6: We import the relevant packages.
- Lines 10-26: We define a
Personclass withnameandageas class attributes. - Lines 28-29: We create a list of the
Personobjects with different names and age values called thepersonList. - Line 31: We print the
personList. - Line 33: We create a stream from the
personList. - Line 35-36: We first apply the
groupingByreduction with the person name as the group by key. We then map thegroupingByoperation’s result to only extract theagevalue from the groupedPersonobjects to a list. - Line 38: We print the map of a person’s name to a set of persons’ ages with the same name to the console.