Автор оригинала: Pankaj Kumar.
Java Collectors-это служебный класс, который предоставляет множество полезных реализаций интерфейса коллектора. Реализация сборщика используется с методом Stream collect (). Этот класс был представлен в Java 8 вместе с потоковым API. Коллекторы-это конечный класс, и все методы являются статическими, которые возвращают экземпляр Коллектора.
Методы коллекторов Java
Некоторые из популярных методов сбора Java являются:
- Коллекция(Поставщик)
- тоЛист()
- Тосет()
- toMap(Функция, Функция)
- присоединение()
- отображение(Функция, Коллектор)
- фильтрация(Предикат, Коллектор)
- Сбор и затем(Коллектор, Функция)
- подсчет()
- минБи(компаратор)
- Максби(компаратор)
- Суммирующая функция(ToIntFunction), суммируЮщая функция(ToLongFunction), суммирующая функция(ToDoubleFunction)
- Усреднение по времени(функция toInt), усреднение по времени(функция toLong), усреднение по времени(функция ToDoubleFunction)
- Группировка по(Функции)
- Группирование по току(Функция)
- Разделение по(предикату)
- сокращение(Двоичный оператор)
- Подведение итогов(функция toInt)
- Лямбда-выражение Java
- Ссылочные типы и примеры методов Java
Примеры коллекторов Java
Давайте рассмотрим примеры функций коллекторов на простых примерах.
1. Сбор средств(Поставщик)
Эта функция возвращает коллектор, который собирает входные элементы в коллекцию.
ListstrList = Arrays.asList("a", "b", "c", "b", "a"); // toCollection() Collection strCollection = strList.parallelStream().collect(Collectors.toCollection(HashSet::new)); System.out.println(strCollection); // [a, b, c] Set strSet = strList.parallelStream().collect(Collectors.toCollection(HashSet::new)); System.out.println(strSet); // [a, b, c] List strList1 = strList.parallelStream().sorted(String::compareToIgnoreCase) .collect(Collectors.toCollection(ArrayList::new)); System.out.println(strList1); // [a, a, b, b, c]
2. Java – коллекторы ToList()
Он возвращает сборщик, который собирает входные элементы в новый список.
ListstrList = Arrays.asList("a", "b", "c", "b", "a"); List uppercaseList = strList.parallelStream().map(String::toUpperCase).collect(Collectors.toList()); System.out.println(uppercaseList); // [A, B, C, B, A] List uppercaseUnmodifiableList = strList.parallelStream().map(String::toUpperCase) .collect(Collectors.toUnmodifiableList()); System.out.println(uppercaseUnmodifiableList); // [A, B, C, B, A]
Коллекционеры Java должны перечислять
3. Набор коллекторов Java()
Этот метод возвращает сборщик, который собирает входные элементы в новый набор.
ListstrList = Arrays.asList("a", "b", "c", "b", "a"); Set uppercaseSet = strList.parallelStream().map(String::toUpperCase).collect(Collectors.toSet()); System.out.println(uppercaseSet); // [A, B, C] Set uppercaseUnmodifiableSet = strList.parallelStream().map(String::toUpperCase) .collect(Collectors.toUnmodifiableSet()); System.out.println(uppercaseUnmodifiableSet); // [A, B, C]
4. Java – коллекторы toMap(Функция, Функция)
Этот статический метод возвращает коллектор для накопления входных элементов в новую карту. Мы должны указать функции отображения для создания ключей и значений карты.
Mapmap = Stream.of("a", "b", "c") .collect(Collectors.toMap(Function.identity(), String::toUpperCase)); System.out.println(map); // {a=A, b=B, c=C} // Duplicate Keys will throw: Exception in thread "main" // java.lang.IllegalStateException: Duplicate key a (attempted merging values A // and A) Map mapD = Stream.of("a", "b", "c", "b", "a") .collect(Collectors.toMap(Function.identity(), String::toUpperCase, String::concat)); System.out.println(mapD); // {a=AA, b=BB, c=C} // above are HashMap, use below to create different types of Map TreeMap mapTree = Stream.of("a", "b", "c", "b") .collect(Collectors.toMap(Function.identity(), String::toUpperCase, String::concat, TreeMap::new)); System.out.println(mapTree); {a=A, b=BB, c=C}
5. Присоединение к коллекторам Java()
Он возвращает коллектор, который объединяет входные элементы последовательности символов в новую строку. Существует несколько перегруженных методов для указания разделителя и строк суффикса/префикса.
String concat = Stream.of("a", "b").collect(Collectors.joining()); System.out.println(concat); // ab String csv = Stream.of("a", "b").collect(Collectors.joining(",")); System.out.println(csv); // a,b String csv1 = Stream.of("a", "b").collect(Collectors.joining(",", "[", "]")); System.out.println(csv1); // [a,b] String csv2 = Stream.of("a", new StringBuilder("b"), new StringBuffer("c")).collect(Collectors.joining(",")); System.out.println(csv2); // a,b
6. Отображение коллекторов Java(Функция, Коллектор)
Этот метод возвращает коллектор, который применяет функцию к входным элементам, а затем накапливает их в данный коллектор.
SetsetStr = Stream.of("a", "a", "b") .collect(Collectors.mapping(String::toUpperCase, Collectors.toSet())); System.out.println(setStr); // [A, B] Set setStr1 = Stream.of("a", "a", "b") .collect(Collectors.flatMapping(s -> Stream.of(s.toUpperCase()), Collectors.toSet())); System.out.println(setStr1); // [A, B]
7. фильтрация(Предикат, Коллектор)
Он возвращает сборщик, который применяет Предикат к входным элементам и накапливает их в данный сборщик, если предикат возвращает значение true.
ListstrList2 = List.of("1", "2", "10", "100", "20", "999"); Set set = strList2.parallelStream() .collect(Collectors.filtering(s -> s.length() < 2, Collectors.toSet())); System.out.println(set); // [1, 2]
8. Сбор и затем(Сборщик, Функция)
Этот статический метод возвращает коллектор, который накапливает входные элементы в данный коллектор, а затем выполняет дополнительную функцию завершения.
ListstrList2 = List.of("1", "2", "10", "100", "20", "999"); List unmodifiableList = strList2.parallelStream() .collect(Collectors.collectingAndThen(Collectors.toList(), Collections::unmodifiableList)); System.out.println(unmodifiableList); // [1, 2, 10, 100, 20, 999]
9. подсчет()
Эта функция возвращает коллектор, который подсчитывает количество входных элементов.
Long evenCount = Stream.of(1, 2, 3, 4, 5).filter(x -> x % 2 == 0).collect(Collectors.counting()); System.out.println(evenCount); // 2
10. минБи(компаратор)
Он возвращает коллектор, который возвращает минимальный элемент на основе данного компаратора.
Optionalmin = Stream.of(1, 2, 3, 4, 5).collect(Collectors.minBy((x, y) -> x - y)); System.out.println(min); // Optional[1]
11. Максби(компаратор)
Этот метод возвращает коллектор, который возвращает максимальный элемент на основе данного компаратора.
Optionalmax = Stream.of(1, 2, 3, 4, 5).collect(Collectors.minBy((x, y) -> y - x)); System.out.println(max); // Optional[5]
12. Функция суммирования(ToIntFunction)
Этот статический метод возвращает коллектор, который создает сумму целочисленной функции, примененной к входным элементам. Существуют аналогичные функции для long и double – summingLong(функция toLong) и summingDouble(функция ToDoubleFunction).
ListstrList3 = Arrays.asList("1", "2", "3", "4", "5"); Integer sum = strList3.parallelStream().collect(Collectors.summingInt(Integer::parseInt)); System.out.println(sum); // 15 Long sumL = Stream.of("12", "23").collect(Collectors.summingLong(Long::parseLong)); System.out.println(sumL); // 35 Double sumD = Stream.of("1e2", "2e3").collect(Collectors.summingDouble(Double::parseDouble)); System.out.println(sumD); // 2100.0
13. Усреднение(функция toInt)
Он возвращает коллектор, который выдает среднее арифметическое целочисленной функции, примененной к входным элементам. Существуют аналогичные функции для long и double – averagingLong(функция toLong) и averagingDouble(функция ToDoubleFunction).
ListstrList4 = Arrays.asList("1", "2", "3", "4", "5"); Double average = strList4.parallelStream().collect(Collectors.averagingInt(Integer::parseInt)); System.out.println(average); // 3.0 Double averageL = Stream.of("12", "23").collect(Collectors.averagingLong(Long::parseLong)); System.out.println(averageL); // 17.5 Double averageD = Stream.of("1e2", "2e3").collect(Collectors.averagingDouble(Double::parseDouble)); System.out.println(averageD); // 1050.0
14. Группировка коллекторов Java по(Функции)
Этот метод возвращает сборщик, реализующий операцию “группировка по” для входных элементов. Конечным результатом является хэш-карта. Существует несколько перегруженных методов для указания Поставщика (окончательный тип карты, по умолчанию-HashMap) и Сборщика (тип списка значений, по умолчанию-ArrayList).
Map> mapGroupBy = Stream.of(1, 2, 3, 4, 5, 4, 3) .collect(Collectors.groupingBy(x -> x * 10)); System.out.println(mapGroupBy); // {50=[5], 20=[2], 40=[4, 4], 10=[1], 30=[3, 3]}
15. Группирование по току(Функция)
Он работает так же, как и коллектор groupingBy (). Единственное отличие состоит в том, что сборщик является параллельным и неупорядоченным. Он будет иметь лучшую производительность, чем сборщик groupingBy (), но порядок не будет сохранен.
Map> mapGroupBy = Stream.of(1, 2, 3, 4, 5, 4, 3) .collect(Collectors.groupingByConcurrent(x -> x * 10)); System.out.println(mapGroupBy); // {50=[5], 20=[2], 40=[4, 4], 10=[1], 30=[3, 3]}
16. Разделение по(предикату)
Этот метод возвращает сборщик, который разбивает входные элементы в соответствии с Предикатом и организует их в карту<Логическое значение, список>.
Map> mapPartitionBy = Stream.of(1, 2, 3, 4, 5, 4, 3) .collect(Collectors.partitioningBy(x -> x % 2 == 0)); System.out.println(mapPartitionBy); // {false=[1, 3, 5, 3], true=[2, 4, 4]}
17. Сокращение коллекторов Java(BinaryОператор)
Он возвращает коллектор, который выполняет сокращение своих входных элементов в соответствии с указанным двоичным оператором. Это в основном используется при многоуровневом сокращении, например, при указании нижестоящего коллектора с помощью методов группировки по() и разделения по ().
Map> reducing = Stream.of(1, 2, 3, 4, 5, 4, 3).collect(Collectors.partitioningBy( x -> x % 2 == 0, Collectors.reducing(BinaryOperator.maxBy(Comparator.comparing(Integer::intValue))))); System.out.println(reducing); // {false=Optional[5], true=Optional[4]}
18. подведение итогов Int(функция toInt)
Он возвращает сборщик, который применяет функцию сопоставления, создающую int, к каждому входному элементу, и возвращает сводную статистику для результирующих значений, таких как min, max, среднее значение, количество и количество.
IntSummaryStatistics summarizingInt = Stream.of("12", "23", "35") .collect(Collectors.summarizingInt(Integer::parseInt)); System.out.println(summarizingInt); //IntSummaryStatistics{count=3, sum=70, min=12, average=23.333333, max=35}
Вывод
Статические методы класса Java Collectors очень полезны при создании экземпляра коллектора для использования с методом Stream collect (). Он охватывает почти все самые популярные сценарии.