В лямбда-тяжелых библиотеках до Java 8, таких как Guava, в выходных данных используются общие интерфейсы Java Collection Framework, поэтому их легко передавать во внешние / внутренние API-интерфейсы и при этом использовать некоторые ленивые вычисления, если это делает метод библиотеки (например, lazy filter()
and transform()
).
Тем не менее, в Java 8 Streams, вызов для получения Collection
/ Map
является терминалом (т.е. нетерпеливым), и он также выделит новые структуры данных для хранения результатов.
Для сложных вычислений с несколькими этапами и схемой стратегии в середине это вызывает много ненужных распределений из-за промежуточных результатов.
Итак, думают ли люди, что для внутренних API (т.е. стратегий шаблонов стратегий) Stream
рекомендуется брать и возвращать s, или я должен просто вернуться к ленивым, но не оптимизированным (каламбур, я думаю, что) API-интерфейсам Guava?
Редактировать:
Моя главная проблема Stream
заключается в том, что его можно употреблять только один раз, а передача чего-то вроде этого Supplier<Stream<X>>
выглядит чрезвычайно громоздкой. Это почти подталкивает вас к тому, чтобы просто пройти, Collection
а затем повторить stream()
(и оплатить стоимость тщательной оценки в этот момент).
Ответы:
Ленивость в Java 8 Streams работает так же, как и для Iterables в Guava: вы должны передать Iterable, чтобы остаться ленивым, и оценка произойдет, как только вы создадите коллекцию из Iterator. Оба потока и итераторы могут быть использованы только один раз.
Поэтому для интерфейсов вашего метода более общий способ (разрешающий лень) состоит в том, чтобы использовать интерфейс Stream (всякий раз, когда вы раньше использовали Iterable). Как говорит @Philipp, это позволяет использовать их в конвейерах Stream.
Надеемся, что теперь Stream является официальным стандартным интерфейсом Java, и будет появляться все больше других библиотек и функций, которые могут эффективно работать непосредственно с Streams.
источник