Чтобы попытаться глубоко понять потоки java и разделители, у меня есть некоторые тонкие вопросы о характеристиках spliterator:
Q1: Stream.empty() vs Stream.of() (Stream.of() без аргументов)
-
Stream.empty(): SUBSIZED, SIZED -
Stream.of(): SUBSIZED, IMMUTABLE, SIZED, ORDERED
Почему Stream.empty() не имеет одинаковых характеристик Stream.of()? Обратите внимание, что он имеет влияние при использовании в сочетании с Stream.concat() (специально не имея ORDERED). Я бы сказал, что Stream.empty() должен иметь не только IMMUTABLE и ORDERED, но также DISTINCT и NONNULL. Также имеет смысл Stream.of() с одним аргументом, имеющим DISTICT.
Q2: LongStream.of() не имеет NONNULL
Только что заметил, что NONNULL недоступен в LongStream.of.
Не NONNULL основные характеристики всех LongStream s, IntStream и DoubleStream s?
Q3: LongStream.range(,) vs LongStream.range(,).boxed()
-
LongRange.range(,): SUBSIZED, IMMUTABLE, NONNULL, SIZED, ORDERED, СОРТИРОВАН, DISTINCT -
LongStream.range(,).boxed(): SUBSIZED, SIZED, ORDERED
Почему .boxed() теряет все эти характеристики? Он не должен терять.
Я понимаю, что .mapToObj() может потерять NONNULL, IMMUTABLE и DISTICT, но .boxed()... не имеет смысла.
Q4: .peek() проигрывает IMMUTABLE и NONNULL
LongStream.of(1): СУБИЗНЕС, НЕМЕДЛЕННО, НЕТУЛЬНО, РАЗМЕР,...
LongStream.of(1).peek(): SUBSIZED, SIZED,...
Почему .peek() теряет эти характеристики? .peek не должен действительно терять.
Q5: .skip(), .limit() теряет SUBSIZED, IMMUTABLE, NONNULL, SIZED
Просто обратите внимание, что эти операции теряют SUBSIZED, IMMUTABLE, NONNULL, SIZED. Зачем? Если размер доступен, то также легко вычислить конечный размер.
Q6: .filter() проигрывает IMMUTABLE, NONNULL
Просто заметьте, что эта операция также теряет СУБИЗНЕС, НЕМЕДЛЕННО, НЕТУЛЬНО, РАЗМЕР. Имеет смысл потерять SUBSIZED и SIZED, но остальные два не имеют смысла. Почему?
Буду признателен, если кто-то, кто глубоко понимает, разделитель может принести определенную ясность. Спасибо.