Класс Collectors
Класс Collectors - это утилитарный класс из пакета
java.util.stream, который содержит статические методы
для создания коллекторов. Коллектор - это объект, который
описывает, как накапливать элементы потока в итоговый
результат. Класс Collectors используется вместе с
терминальным методом collect интерфейса Stream.
Коллекторы позволяют собирать элементы в List,
Set, Map, объединять строки, группировать
элементы по признаку, разделять на две группы, считать
количество, суммировать и выполнять множество других
операций.
Синтаксис
Collectors.toList()
Collectors.toSet()
Collectors.toMap(keyMapper, valueMapper)
Collectors.joining(delimiter)
Collectors.groupingBy(classifier)
Collectors.partitioningBy(predicate)
Collectors.counting()
Collectors.summarizingInt(mapper)
Collectors.reducing(identity, mapper, op)
Collectors.mapping(mapper, downstream)
Collectors.filtering(predicate, downstream)
Collectors.flatMapping(mapper, downstream)
Collectors.teeing(downstream1, downstream2, merger)
Пример
Давайте соберем элементы потока в список с помощью
коллектора toList:
import java.util.List;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<String> res = List.of("a", "b", "c", "d", "e")
.stream()
.collect(Collectors.toList());
System.out.println(res);
}
}
Результат выполнения кода:
[a, b, c, d, e]
Пример
Давайте соберем элементы потока в множество с помощью
коллектора toSet:
import java.util.Set;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
Set<Integer> res = List.of(1, 2, 3, 4, 5)
.stream()
.collect(Collectors.toSet());
System.out.println(res);
}
}
Результат выполнения кода:
[1, 2, 3, 4, 5]
Пример
Давайте объединим элементы потока в одну строку
с разделителем с помощью коллектора joining:
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
String res = List.of("a", "b", "c", "d", "e")
.stream()
.collect(Collectors.joining("-"));
System.out.println(res);
}
}
Результат выполнения кода:
"a-b-c-d-e"
Пример
Давайте сгруппируем элементы потока по длине строки
с помощью коллектора groupingBy:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
Map<Integer, List<String>> res = List.of("a", "b", "c", "d", "e")
.stream()
.collect(Collectors.groupingBy(String::length));
System.out.println(res);
}
}
Результат выполнения кода:
{1=[a, b, c, d, e]}
Пример
Давайте посчитаем количество элементов потока
с помощью коллектора counting:
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
Long res = List.of(1, 2, 3, 4, 5)
.stream()
.collect(Collectors.counting());
System.out.println(res);
}
}
Результат выполнения кода:
5
Пример
Давайте соберем элементы потока в карту с помощью
коллектора toMap, где ключом будет строка,
а значением - ее длина:
import java.util.Map;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
Map<String, Integer> res = List.of("a", "b", "c", "d", "e")
.stream()
.collect(Collectors.toMap(s -> s, String::length));
System.out.println(res);
}
}
Результат выполнения кода:
{a=1, b=1, c=1, d=1, e=1}
Пример
Давайте разделим элементы потока на две группы
по условию с помощью коллектора partitioningBy:
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
Map<Boolean, List<Integer>> res = List.of(1, 2, 3, 4, 5)
.stream()
.collect(Collectors.partitioningBy(n -> n % 2 == 0));
System.out.println(res);
}
}
Результат выполнения кода:
{false=[1, 3, 5], true=[2, 4]}
Смотрите также
-
метод
toList,
который собирает элементы в список -
метод
toSet,
который собирает элементы в множество -
метод
groupingBy,
который группирует элементы по признаку -
метод
joining,
который объединяет элементы в строку