Рубрики
Без рубрики

Примеры методов сбора потока Java()

Java Stream collect() выполняет изменяемую операцию сокращения элементов потока. Это терминальная операция. Что такое Изменчивое сокращение

Автор оригинала: Pankaj Kumar.

Java Stream collect() выполняет изменяемую операцию сокращения элементов потока. Это терминальная операция.

Что такое Операция Изменяемого сокращения?

Операция изменяемого сокращения обрабатывает элементы потока, а затем накапливает их в контейнер изменяемого результата. Как только элементы обработаны, функция объединения объединяет все контейнеры результатов для создания результата.

Подпись метода сбора потока Java()

Существует два варианта метода Java Stream collect ().

  1. Сбор R(Поставщик поставщик, двоичный потребитель ? супер T> аккумулятор,двоичный потребитель R> объединитель) ? супер T> аккумулятор,двоичный потребитель R> объединитель) R> объединитель)
  2. A> R собрать(Коллектор супер T, A, R> коллектор) A> R собрать(Коллектор супер T, A, R> коллектор) супер T, A, R> коллектор)

Коллектор – это интерфейс, который предоставляет оболочку для объектов поставщика, аккумулятора и объединителя. Второй метод полезен, когда мы используем класс Collectors для обеспечения встроенной реализации коллектора.

Тремя параметрами функции collect() являются:

  1. поставщик : функция, которая создает новый контейнер изменяемых результатов. Для параллельного выполнения эта функция может вызываться несколько раз и каждый раз должна возвращать новое значение.
  2. накопитель – это функция без состояния, которая должна складывать элемент в контейнер результатов.
  3. объединитель – это функция без состояния, которая принимает два контейнера частичных результатов и объединяет их, что должно быть совместимо с функцией накопителя.

Примеры методов сбора потока()

Давайте рассмотрим некоторые примеры метода Stream.collect ().

1. Объединение списка строк

Допустим, вы хотите объединить список строк, чтобы создать новую строку. Мы можем использовать функцию Stream collect() для выполнения операции изменяемого сокращения и объединения элементов списка.

List vowels = List.of("a", "e", "i", "o", "u");

// sequential stream - nothing to combine
StringBuilder result = vowels.stream().collect(StringBuilder::new, (x, y) -> x.append(y),
		(a, b) -> a.append(",").append(b));
System.out.println(result.toString());

// parallel stream - combiner is combining partial results
StringBuilder result1 = vowels.parallelStream().collect(StringBuilder::new, (x, y) -> x.append(y),
		(a, b) -> a.append(",").append(b));
System.out.println(result1.toString());

Выход:

aeiou
a,e,i,o,u
  • Функция поставщика возвращает новый объект StringBuilder при каждом вызове.
  • Функция накопителя добавляет элемент строки списка в экземпляр StringBuilder.
  • Функция объединения объединяет экземпляры StringBuilder. Экземпляры объединяются друг с другом с запятой между ними.
  • В первом случае мы имеем последовательный поток элементов. Таким образом, они обрабатываются один за другим, и существует только один экземпляр StringBuilder. Функция объединения не используется. Вот почему полученный результат является “aeiou”.
  • Во втором случае мы имеем параллельный поток строк. Таким образом, элементы обрабатываются параллельно, и существует несколько экземпляров StringBuilder, которые объединяются функцией объединения. Следовательно, полученный результат равен “a,e,i,o,u”.
  • Если источник потока упорядочен , например Список , метод collect() поддерживает порядок во время обработки. Если источник потока неупорядочен , например Set , то метод collect() может давать разные результаты при каждом вызове.

Если вы хотите объединить список строк, мы можем использовать ссылки на методы для уменьшения размера кода.

String result2 = vowels.parallelStream()
		.collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
		.toString();

2. Поток collect() для перечисления с помощью класса Collectors

Класс Collectors предоставляет множество полезных реализаций интерфейса Collector. Давайте рассмотрим пример, в котором мы отфильтруем список целых чисел, чтобы выбрать только четные целые числа. Фильтр потока() является промежуточной операцией и возвращает поток. Итак, мы будем использовать функцию collect() для создания списка из этого потока.

List numbers = List.of(1, 2, 3, 4, 5, 6);
		
List evenNumbers = numbers.stream().filter(x -> x % 2 == 0).collect(Collectors.toList());
System.out.println(evenNumbers);  // [2, 4, 6]

Коллекционеры.Функция ToList() возвращает реализацию сборщика, которая собирает входные элементы в новый список.

3. Поток collect() в набор

Мы можем использовать Collectors.to Set() для сбора элементов потока в новый набор.

List numbers = List.of(1, 2, 3, 4, 5, 6);

Set oddNumbers = numbers.parallelStream().filter(x -> x % 2 != 0).collect(Collectors.toSet());
System.out.println(oddNumbers); // [1, 3, 5]

3. Поток сбора() для отображения

Мы можем использовать функцию Collectors.toMap() для сбора элементов потока на карту . Этот метод принимает два аргумента для ключа сопоставления и соответствующее значение в карте.

List numbers = List.of(1, 2, 3, 4, 5, 6);

Map mapOddNumbers = numbers.parallelStream().filter(x -> x % 2 != 0)
		.collect(Collectors.toMap(Function.identity(), x -> String.valueOf(x)));
System.out.println(mapOddNumbers); // {1=1, 3=3, 5=5}

4. Пример присоединения коллекторов()

Мы можем использовать методы объединения коллекторов (), чтобы получить Коллектор, который объединяет элементы последовательности входного потока в порядке встреч. Мы можем использовать это для объединения потока строк, буфера строк или построителя строк.

jshell> String value = Stream.of("a", "b", "c").collect(Collectors.joining());
value ==> "abc"

jshell> String valueCSV = Stream.of("a", "b", "c").collect(Collectors.joining(","));
valueCSV ==> "a,b,c"

jshell> String valueCSVLikeArray = Stream.of("a", "b", "c").collect(Collectors.joining(",", "{", "}"));
valueCSVLikeArray ==> "{a,b,c}"

jshell> String valueObject = Stream.of("1", new StringBuffer("2"), new StringBuilder("3")).collect(Collectors.joining());
valueObject ==> "123"

Выход:

Пример сбора потока Java()

Вывод

Java Stream collect() в основном используется для сбора элементов потока в коллекцию. Это конечная операция. Он обеспечивает синхронизацию при использовании с параллельным потоком. Класс Collectors предоставляет множество реализаций коллекторов, которые помогут нам в этом.

Рекомендации