Innymi słowy, czy następująca linia jest gwarantująca wydrukowanie linii num
?Czy Stream.count() gwarantuje obecność w każdym elemencie?
int num = list.stream().peek(System.out::println).count();
To pytanie zostało wywołane przez dyskusji w komentarzach https://stackoverflow.com/a/41346586/2513200
I mgliście pamiętam dyskusję, że optymalizacje, że trzeba unikać iteracji może być legalne, ale nie znaleźliśmy nic rozstrzygającego podczas szybkiego wyszukiwania.
JavaDocs for Stream.count zawierać to oświadczenie:
Jest to szczególny przypadek redukcji i odpowiada:
return mapToLong(e -> 1L).sum();
ale nie jestem pewien, czy to daje żadnych gwarancji, jeśli strumień może w jakiś sposób określić wynik w sposób zwarcia.
Zostanie zmodyfikowany w Javie 9 (patrz uwaga do API): http://download.java.net/java/jdk9/docs/api/java/util/stream/Stream.html#count-- –
Parametr _result_ jest wymagany, nie można niczego wykonać. – Cubic
Tuż po tej części dokumentacji znajdziesz: "Implementacja może nie wykonywać potoku potoku [...], jeśli jest w stanie obliczać liczbę bezpośrednio ze źródła strumienia. W takich przypadkach żadne elementy źródłowe nie będą przechodzić i nie będą oceniane żadne operacje pośrednie. " –