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

Поток Java 8 – Функция peek() не работает с функцией count()?

– Поток Java 8 – Функция peek() не работает с функцией count()?

Во многих примерах используется .count() в качестве терминальной операции для .peek() , например:

	List l = Arrays.asList("A", "B", "C", "D");

	long count = l.stream().peek(System.out::println).count();

	System.out.println(count); // 4

Выход – Все работает нормально.

A
B
C
D
4

Однако для Java 9 и выше функция peek() может ничего не печатать:

	List l = Arrays.asList("A", "B", "C", "D");

	long count = l.stream().peek(System.out::println).count();

	System.out.println(count); // 4

Выход

4

Почему peek() ничего не печатает сейчас?

Обратитесь к Java 9 .подсчет () Документы Java

An implementation may choose to not execute the stream pipeline (either sequentially or in parallel) 
if it is capable of computing the count directly from the stream source. 
In such cases no source elements will be traversed and no intermediate operations will be evaluated. 

Начиная с Java 9, если компилятор JDK способен вычислять количество непосредственно из потока (оптимизация в Java 9), он не пересекал поток, поэтому нет необходимости запускать peek() вообще.

	List l = Arrays.asList("A", "B", "C", "D");
	
	// JDK compiler know the size of the stream via the variable l 
	long count = l.stream().peek(System.out::println).count();

Чтобы принудительно запустить peek() , просто измените некоторые элементы с помощью filter() или переключитесь на другую операцию терминала, например collect()

	List l = Arrays.asList("A", "B", "C", "D");

	long count = l.stream()
			.filter(x->!x.isEmpty())
			.peek(System.out::println)
			.count();

	System.out.println(count); // 4

Выход

A
B
C
D
4
	List l = Arrays.asList("A", "B", "C", "D");

	List result = l.stream()
			.peek(System.out::println)
			.collect(Collectors.toList());

	System.out.println(result.size()); // 4

Выход

A
B
C
D
4

Будьте осторожны при смешивании .peek() с .count() , peek() может работать не так, как ожидалось в Java 9 и выше.

P.S Протестировано с Java 12

Оригинал: “https://mkyong.com/java8/java-8-stream-the-peek-is-not-working-with-count/”