Является ли следующее утверждение истинным?
(Источник и источник - они, похоже, копируют друг из друга или поступают из одного источника).
Операция
sorted()
представляет собой "промежуточную операцию с промежуточным состоянием", что означает, что последующие операции больше не действуют на коллекцию поддержки, а во внутреннем состоянии.
Я протестировал Stream::sorted
как фрагмент из приведенных выше источников:
final List<Integer> list = IntStream.range(0, 10).boxed().collect(Collectors.toList());
list.stream()
.filter(i -> i > 5)
.sorted()
.forEach(list::remove);
System.out.println(list); // Prints [0, 1, 2, 3, 4, 5]
Оно работает. Я заменил Stream::sorted
Stream::distinct
, Stream::limit
и Stream::skip
:
final List<Integer> list = IntStream.range(0, 10).boxed().collect(Collectors.toList());
list.stream()
.filter(i -> i > 5)
.distinct()
.forEach(list::remove); // Throws NullPointerException
К моему удивлению, NullPointerException
.
Все проверенные методы следуют за промежуточными рабочими характеристиками состояния. Тем не менее, это уникальное поведение Stream::sorted
не документировано, а часть операций Stream и конвейеров объясняет, действительно ли промежуточные операции с сохранением состояния гарантируют новую исходную коллекцию.
Откуда возникает мое замешательство и как объясняется поведение выше?