Потоковые коллекторы — это мощная функция Java 8 Stream API, позволяющая эффективно собирать и обрабатывать данные. Мы объясним структуру и возможные варианты использования метода collect в Java.
Каково использование Java Collect()?
Сборщик потока можно использовать для создания списка, набора или сопоставления из потока. Поток — это последовательность элементов, которые обрабатываются один за другим. Интерфейс Collector предоставляет набор операций сокращения данных в потоковом конвейере. Это терминальные операции, которые собирают и объединяют результаты промежуточных шагов.
Например, коллекторы можно использовать для фильтрации или сортировки объектов из потока. Также возможно агрегирование, например, суммирование чисел, суммирование строк или подсчет элементов. Кроме того, у сборщиков есть функции для преобразования содержимого потока в определенную структуру. Например, вы можете превратить список в карту. Группы помогают классифицировать элементы с определенными свойствами или условиями. Что наиболее важно, у Stream Collectors есть преимущество параллельной обработки данных с использованием нескольких потоков. В результате операции, особенно с большими объемами данных, могут выполняться намного быстрее и эффективнее.
Это синтаксис Java Collect()
Метод принимает Collector в качестве аргумента, описывающего, как собирать и объединять элементы потока. Сборщик — это интерфейс, который предоставляет различные методы для сборки элементов потока в определенную форму, например. B. в списке, наборе или карте.
Существует два типа метода сбора Java:
- R collect (поставщик Supplier, накопитель BiConsumer<R, ? super T>, объединитель BiConsumer<R, R>)
- <R, A> R collect(Коллектор <? super T, A, R> коллектор)
Первый вариант имеет в качестве аргументов три функции:
- поставщик : создает контейнер, используемый для промежуточных результатов.
- аккумулятор : вычисляет окончательный результат.
- комбинатор : объединяет результаты операций с параллельными потоками.
Эти предопределенные сборщики уже включены в стандартную библиотеку и могут быть легко импортированы и использованы.
Второй вариант принимает коллектор в качестве аргумента и возвращает результат.
- R : тип результата
- T : тип элементов в потоке
- A : тип аккумулятора, в котором хранится промежуточное состояние работы коллектора.
- collector : выполняет операцию редукции.
Используя этот вариант, разработчики могут создавать настраиваемые сборщики, соответствующие их потребностям, и обеспечивать большую гибкость и контроль над процессом сокращения.
Практические примеры использования Java Collect()
Далее мы иллюстрируем различные функции метода Stream.collect(). Вы уже должны быть знакомы с основными операторами Java, прежде чем углубляться в Collection Framework.
Объединить список строк
Используя Java Collect(), мы можем объединить список строк, чтобы получить новую строку:
List<String> letters = List.of("a", "b", "c", "d", "e"); // without combiner function StringBuilder result = letters.stream().collect(StringBuilder::new, (x, y) -> x.append(y), (a, b) -> a.append(",").append(b)); System.out.println(result.toString()); // with combiner function StringBuilder result1 = letters.parallelStream().collect(StringBuilder::new, (x, y) -> x.append(y), (a, b) -> a.append(",").append(b)); System.out.println(result1.toString());
Мы получаем вывод:
abcde a, b, c, d, e
В первом вычислении используется только один экземпляр StringBuilder, и функция объединения не использовалась. Поэтому результат есть abcde.
Во втором выводе мы видим, что функция объединения объединила экземпляры StringBuilder и разделила их запятой.
Собирать элементы в список с помощью toList()
С помощью функции мы можем выбрать определенные элементы списка и сохранить их в новом списке.filter()toList()
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7); List<Integer> oddNumbers = numbers.stream().filter(x -> x % 2 != 0).collect(Collectors.toList()); System.out.println(oddNumbers);
Новый список теперь содержит только нечетные числа:
[1, 3, 5, 7]
Соберите элементы в набор с помощью toSet()
Точно так же мы можем создать новый набор из выбранных элементов. Порядок может быть неупорядоченным в наборе.
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7); Set<Integer> evenNumbers = numbers.parallelStream().filter(x -> x % 2 == 0).collect(Collectors.toSet()); System.out.println(evenNumbers);
Это приводит к выводу:
[2, 4, 6]
Соберите элементы на карту, используя toMap()
Карта в сочетании с Java Collect() присваивает значение каждому ключу.
List<Integer> numbers = List.of(1, 2, 3, 4, 5, 6, 7); Map<Integer, String> mapEvenNumbers = numbers.parallelStream().filter(x -> x % 2 == 0) .collect(Collectors.toMap(Function.identity(), x -> String.valueOf(x))); System.out.println(mapEvenNumbers);
В выводе мы видим, что ввод, состоящий из четных чисел, был сопоставлен с его идентичными значениями:
{2=2, 4=4, 6=6}
Объедините элементы в строку, используя joining()
Метод добавляет каждый элемент в поток в порядке их появления и использует разделитель для разделения элементов. Разделитель передается в качестве аргумента. Если разделитель не указан, используйте пустую строку .joining()joining()joining()""
jshell> String result1 = Stream.of("a", "b", "c").collect(Collectors.joining()); jshell> String result2 = Stream.of("a", "b", "c").collect(Collectors.joining(",", "{", "}"));
Результаты:
result1 ==> "abc" result2 ==> "{a,b,c}"








