В основном это пришло, пытаясь ответить на другой вопрос. Предположим, что этот код:
AtomicInteger i = new AtomicInteger(0);
AtomicInteger count = new AtomicInteger(0);
IntStream.generate(() -> i.incrementAndGet())
.parallel()
.peek(x -> count.incrementAndGet())
.limit(5)
.forEach(System.out::println);
System.out.println("count = " + count);
Я понимаю, что IntStream#generate
является неупорядоченным бесконечным потоком, и для его завершения в этом случае должна выполняться операция короткого замыкания (limit
). Я также понимаю, что Supplier
можно назвать так много раз, как кажется реалистичной реализации Stream, пока не достигнет этого предела.
Запустив это под java-8, будет печатать count
always 512
(может быть не всегда, но это так на моей машине).
В отличие от этого, под java-10 редко превышает 5
. Поэтому мой вопрос заключается в том, что внутренне изменилось, что короткое замыкание происходит намного лучше (я пытаюсь ответить на это самостоятельно, имея источники и пытаясь сделать некоторые различия...)