The collectingAndThen(Collector downstream, Function finisher) method of class collectors in Java, which adopts Collector so that we can perform an additional finishing transformation. Syntax :
public static <T, A, R, RR>
Collector <T, A, RR>
collectingAndThen(Collector <T, A, R> downstream,
Function <R, RR> finisher)
Where,
T : The type of the input elements
A :Intermediate accumulation type of the downstream collector
R :Result type of the downstream collector
RR :Result type of the resulting collector
Parameters:This method accepts two parameters which are listed below
- downstream: It is an instance of a collector, i.e we can use any collector can here.
- finisher: It is an instance of a function which is to be applied to the final result of the downstream collector.
Returns: Returns a collector which performs the action of the downstream collector, followed by an additional finishing step, with the help of finisher function. Below are examples to illustrate collectingAndThen() the method. Example 1: To create an immutable listÂ
Java
// Write Java code here// Collectors collectingAndThen() methodÂ
import java.util.Collections;import java.util.List;import java.util.stream.Collectors;import java.util.stream.Stream;Â
public class GFG {    public static void main(String[] args)    {        // Create an Immutable List        List<String> lt            = Stream                  .of("GEEKS", "For", "GEEKS")                  .collect(Collectors                               .collectingAndThen(                                   Collectors.toList(),                                   Collections::<String> unmodifiableList));        System.out.println(lt);    }} |
[GEEKS, For, GEEKS]
Example 2: To create an immutable set.Â
Java
// Write Java code hereimport java.util.Collections;import java.util.List;import java.util.Set;import java.util.stream.Collectors;import java.util.stream.Stream;Â
public class GFG {    public static void main(String[] args)    {        // Create an Immutable Set        Set<String> st            = Stream                  .of("GEEKS", "FOR", "GEEKS")                  .collect(                      Collectors                          .collectingAndThen(Collectors.toSet(),                                             Collections::<String>                                                 unmodifiableSet));        System.out.println(st);    }} |
[GEEKS, FOR]
Example 2: To create an immutable mapÂ
Java
import java.util.*;Â
public class GFG {    public static void main(String[] args)    {        // Create an Immutable Map        Map<String, String> mp            = Stream                  .of(new String[][] {                      { "1", "Geeks" },                      { "2", "For" },                      { "3", "Geeks" } })                  .collect(                      Collectors                          .collectingAndThen(                              Collectors.toMap(p -> p[0], p -> p[1]),                              Collections::<String, String>                                  unmodifiableMap));        System.out.println(mp);    }} |
{1=Geeks, 2=For, 3=Geeks}
Note:This method is most commonly used for creating immutable collections.
