Справочник по C#

    Исходники по языку программирования CSharp

    Поток Java 8 – peek () не работает с count ()?

    /
    /
    /
    68 Views

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

    Java 8

    
    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() может ничего не печатать:

    Java 9 и выше

    
    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 .count () 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-компилятор способен вычислять count непосредственно из потока (оптимизация в Java 9), поток не проходил, поэтому запускать не нужно peek() совсем.

    
    List l = Arrays.asList("A", "B", "C", "D");
    
    // JDK-компилятор знает размер потока через переменную 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 и выше.

    PS Протестировано с Java 12

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

    граф Ява 8 Ява 9 Peek Stream

    Поток Java 8 – peek () не работает с count ()?

    0.00 (0%) 0 votes

    moyadcode13
    • Facebook
    • Twitter
    • Google+
    • Linkedin
    • Pinterest