In this tutorial we’ll discuss Collectors
class and few of its important methods.
The Stream.collect() method
collect()
method is provided by the Stream
interface.
<R,A> R collect(Collector<? super T, A,R> collector)
This method performs a mutable reduction operation on the elements of this stream using a Collector
. A mutable reduction operation accumulates input elements into a mutable result container, such as a Collection
or StringBuilder
, as it processes the elements in the stream.
This is a terminal operation.
Collectors
Collectors class is present in java.util.stream
package. This class contains implementation of Collector
that implement various useful reduction operations, such as accumulating elements into collections. Methods of this class are static
.
We’ll now discuss few important methods of Collectors
class.
1. Collectors.toList()
static <T> Collector<T,?,List<T>> toList()
This method returns a Collector
that accumulates the input elements into a new List
.
Example: providedList.stream().collect(Collectors.toList());
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class CollectorsExample { public static void main(String[] args) { //Create a list for demo purpose List<String> providedList = Arrays.asList("one","two","three","four","five"); //Collect element of stream to list List<String> result = providedList.stream().collect(Collectors.toList()); System.out.println(result); } }
Output
[one, two, three, four, five]
2. Collectors.toSet()
static <T> Collector<T,?,Set<T>> toSet()
This method returns a Collector
that accumulates the input elements into a new Set
.
Example: providedList.stream().collect(Collectors.toSet());
import java.util.Arrays; import java.util.List; import java.util.Set; import java.util.stream.Collectors; public class CollectorsExample { public static void main(String[] args) { //Create a list for demo purpose List<String> providedList = Arrays.asList("one","two","three","four","five", "one", "two"); //Collect element of stream to set Set<String> result = providedList.stream().collect(Collectors.toSet()); System.out.println(result); } }
Output
[four, one, two, three, five]
In this example, note that the duplicate element “one” and “two” are removed.
3. Collectors.toMap()
This method has three overloaded variations. Here, we’ll discuss one of these three methods.
static <T,K,U> Collector<T,?,Map<K,U>> toMap(Function<? super T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper)
This method returns a Collector
that accumulates elements into a Map
whose keys and values are the result of applying the provided mapping functions to the input elements.
import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; public class CollectorsExample { public static void main(String[] args) { //Create a list for demo purpose List<String> providedList = Arrays.asList("one","two","three","four","five"); //Collect element of stream to map Map<String, Integer> result = providedList.stream().collect( Collectors.toMap( x -> x.toUpperCase(), // keyMapper function x -> x.length()) // valueMapper function ); System.out.println(result); } }
Output
{FIVE=4, FOUR=4, ONE=3, TWO=3, THREE=5}
Note: IllegalStateException
is thrown in case of duplicate keys.
4. Collectors.toCollection()
It is difficult to assume the implementation of the result of toList() and toSet() collectors. You can use toCollection() method to get result in specific collection.
For example, following example accumulates elements in a LinkedList
.
import java.util.Arrays; import java.util.LinkedList; import java.util.List; import java.util.stream.Collectors; public class CollectorsExample { public static void main(String[] args) { //Create a list for demo purpose List<Integer> providedList = Arrays.asList(1,2,3,4,5); //Accumulate elements in LinkedList LinkedList<Integer> result = providedList.stream().collect(Collectors.toCollection(LinkedList::new)); System.out.println(result); System.out.println(result.getClass()); } }
Output
[1, 2, 3, 4, 5]
class java.util.LinkedList
5. Collectors.counting()
static <T> Collector<T,?,Long> counting()
This method counts the number of input elements.
Example: providedList.stream().collect(Collectors.counting());
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class CollectorsExample { public static void main(String[] args) { //Create a list for demo purpose List<String> providedList = Arrays.asList("one","two","three","four","five"); //count number of elements long count = providedList.stream().collect(Collectors.counting()); System.out.println(count); } }
Output
5
6. Collectors.joining()
static Collector<CharSequence,?,String> joining()
This method returns a Collector
that concatenates the input elements into a String
.
import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; public class CollectorsExample { public static void main(String[] args) { //Create a list for demo purpose List<String> providedList = Arrays.asList("one","two","three","four","five"); //join elements String result = providedList.stream().collect(Collectors.joining()); System.out.println(result); } }
Output
onetwothreefourfive
7. Collectors.maxBy()
static <T> Collector<T,?,Optional<T>> maxBy(Comparator<? super T> comparator)
This method returns a Collector
that produces the maximal element according to a given Comparator
.
import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; public class CollectorsExample { public static void main(String[] args) { //Create a list for demo purpose List<Integer> providedList = Arrays.asList(1,2,3,4,5); //get maximal element as Optional<Integer> Optional<Integer> result = providedList.stream().collect(Collectors.maxBy(Comparator.naturalOrder())); System.out.println(result); } }
Output
Optional[5]
8. Collectors.minBy()
static <T> Collector<T,?,Optional<T>> minBy(Comparator<? super T> comparator)
This method returns a Collector
that produces the minimal element according to a given Comparator
, described as an Optional
.
import java.util.Arrays; import java.util.Comparator; import java.util.List; import java.util.Optional; import java.util.stream.Collectors; public class CollectorsExample { public static void main(String[] args) { //Create a list for demo purpose List<Integer> providedList = Arrays.asList(1,2,3,4,5); //get maximal element as Optional<Integer> Optional<Integer> result = providedList.stream().collect(Collectors.minBy(Comparator.naturalOrder())); System.out.println(result); } }
Output
Optional[1]