Чтобы попытаться глубоко понять потоки 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, но остальные два не имеют смысла. Почему?
Буду признателен, если кто-то, кто глубоко понимает, разделитель может принести определенную ясность. Спасибо.