Метод peek класса Stream
Метод peek класса Stream является промежуточной
операцией и возвращает новый поток, содержащий те же элементы,
что и исходный. Отличие состоит в том, что для каждого элемента
потока вызывается переданное действие. В параметр метода мы
передаем объект типа Consumer, который описывает,
что именно нужно сделать с каждым элементом. Чаще всего
метод peek используют для отладки, логирования
или выполнения побочных действий по ходу обработки потока.
Важно понимать, что peek сам по себе не запускает
обработку потока. Поток является ленивым, поэтому действие
будет выполнено только тогда, когда появится терминальная
операция, например collect, forEach или
count.
Синтаксис
Stream<T> peek(Consumer<? super T> action)
Пример
Давайте создадим поток из чисел и с помощью peek
выведем каждое число в консоль, а затем соберем результат
в список:
import java.util.List;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<Integer> res = List.of(1, 2, 3, 4, 5)
.stream()
.peek(n -> System.out.println("Element: " + n))
.collect(Collectors.toList());
System.out.println(res);
}
}
Результат выполнения кода:
"Element: 1"
"Element: 2"
"Element: 3"
"Element: 4"
"Element: 5"
[1, 2, 3, 4, 5]
Пример
Давайте применим peek после фильтрации, чтобы
увидеть, какие элементы прошли отбор:
import java.util.List;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<Integer> res = List.of(1, 2, 3, 4, 5)
.stream()
.filter(n -> n % 2 == 0)
.peek(n -> System.out.println("Filtered: " + n))
.collect(Collectors.toList());
System.out.println(res);
}
}
Результат выполнения кода:
"Filtered: 2"
"Filtered: 4"
[2, 4]
Пример
Давайте посмотрим, как peek работает со строками,
например, преобразуем каждую строку к верхнему регистру
и выведем промежуточный результат:
import java.util.List;
import java.util.stream.Collectors;
public class Main
{
public static void main(String[] args)
{
List<String> res = List.of("abcde", "12345")
.stream()
.peek(s -> System.out.println("Before: " + s))
.map(String::toUpperCase)
.peek(s -> System.out.println("After: " + s))
.collect(Collectors.toList());
System.out.println(res);
}
}
Результат выполнения кода:
"Before: abcde"
"After: ABCDE"
"Before: 12345"
"After: 12345"
["ABCDE", "12345"]