не мешающий оператор не показывает его содержимое - PullRequest
0 голосов
/ 30 сентября 2018

Не могли бы вы сообщить мне причину, по которой оператор peek не показывает system.out.print?

код :

public static void main(String[] args) {
    //try stream.of
    List<Integer> numbers = Arrays.asList(0,1,2,3,4,5,6,7,8);
     Stream<Integer> p = numbers
    .stream()
    .filter(x -> x >= 5)
    .peek(x-> System.out.print("peek at: " + x));

     System.out.print("peek at: ");
}

Ответы [ 3 ]

0 голосов
/ 30 сентября 2018

Как было сказано выше, потоки ленивы.Это означает, что вычисления не начнутся без операции завершения.Вы можете использовать forEach() в вашем примере.Замена peek на forEach запустит вычисление:

 List<Integer> numbers = Arrays.asList(0,1,2,3,4,5,6,7,8);
 numbers
                .stream()
                .filter(x -> x >= 5)
                .forEach(x-> System.out.print("x: " + x));
0 голосов
/ 30 сентября 2018

peek() - посредническая операция, которая не запускает конвейер обработки потока.У вас должна быть одна и только одна операция Terminal для запуска конвейера обработки потока.Поток по своей природе ленив, так что без одной операции терминала он не будет запущен.Поэтому добавьте одного оператора терминала в свой конвейер, чтобы увидеть, что вам нужно.Вот один из способов сделать это.

long matchCount = numbers.stream().filter(x -> x >= 5)
    .peek(x -> System.out.println("peek at: " + x))
    .count();
0 голосов
/ 30 сентября 2018

Цитирование JavaDoc из Stream # peek () :

Возвращает поток, состоящий из элементов этого потока, дополнительно выполняя предоставленное действие для каждого элемента, поскольку элементыиспользуется из полученного потока.

Это промежуточная операция.

Более подробную информацию об этом можно найти в документации. Но для полноты картины:

Промежуточные операции возвращают новый поток.Они всегда ленивы;выполнение промежуточной операции, такой как filter (), фактически не выполняет никакой фильтрации, но вместо этого создает новый поток, который при прохождении содержит элементы исходного потока, которые соответствуют данному предикату. Обход источника конвейера не начинается до тех пор, пока не будет выполнена терминальная операция конвейера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...