Будет ли смысл синглтон Stream.empty? - PullRequest
2 голосов
/ 19 марта 2020

При некотором профилировании моего текущего приложения верхнее выделение - это чрезмерные вызовы Stream.empty(), что, в свою очередь, выделяет new ReferencePipeline.Head<>, что приводит к множеству поддельных объектов.

Это заставило меня задуматься, как получится Stream.empty() не просто возвращает специальный многоразовый одноразовый поток вместо того, чтобы каждый раз выделять новые? Это было бы хорошей идеей, и если да, то есть ли библиотеки / примеры, которые уже делают это?

Ответы [ 2 ]

4 голосов
/ 19 марта 2020

В отличие от пустых коллекций, потоки являются изменяемыми , даже пустой поток.

Например, Stream имеет метод close(), который изменяет свое состояние. Спецификация требует, чтобы

При работе с потоком после его закрытия возникло исключение IllegalStateException.

В нем также говорится, что

Поток должен работать (вызывая промежуточную или терминальную операцию потока) только один раз. Это исключает, например, «разветвленные» потоки, где один и тот же источник передает два или более конвейеров или несколько обходов одного и того же потока. Реализация потока может вызвать исключение IllegalStateException, если обнаружит, что поток используется повторно.

Это означает, что кэширование экземпляра потока не имеет смысла, поскольку поток не может быть повторно использован в любом случае.

2 голосов
/ 19 марта 2020

Java 8 версия Stream.empty() выглядит следующим образом.

public static<T> Stream<T> empty() {
    return StreamSupport.stream(Spliterators.<T>emptySpliterator(), false);
}

И в StreamSupport

public static <T> Spliterator<T> emptySpliterator() {
    return (Spliterator<T>) EMPTY_SPLITERATOR;
}

private static final Spliterator<Object> EMPTY_SPLITERATOR =
        new EmptySpliterator.OfRef<>();

Так что пока они не используют пустой поток повторно они повторно используют пустой Spliterator, сохраняя немного в распределении объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...