Під час розробки мого API, який не прив’язаний до жодного застарілого коду, я часто виявляю себе способами написання, які суто конвеєр потоків припиняється шляхом збору результатів. Як ця:
ImmutableSet<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfThing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey)
.collect(MyCustomCollectors.toImmutableSet());
}
Зараз більшості клієнтів цього класу зазвичай потрібна колекція (у цьому випадку ImmutableSet) для пошуку елементів та повторення над нею, але деякі клієнти можуть отримати користь від потоку, щоб вони могли виконувати ще деякі операції над цим Потік без необхідності отримувати новий потік із колекції. Тож повернення потоку дає клієнтам набір варіантів, які вони мали б, якби у них просто була колекція (зрештою, вони завжди можуть collect()
передавати себе:
Stream<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfthing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey);
// No collect
}
Цей підхід для мене спокусливий спробувати, оскільки я не бачу жодних потенційних недоліків, які він міг би мати. Однак я жодного разу не бачив такого підходу в жодній бібліотеці (напевно, не було випущено багато бібліотек після появи Java 8), тому я трохи побоююся його застосувати. Існуючі бібліотечні класи зазвичай повертають колекції, коли вони отримують щось із приватного стану.
Чи може статися щось погане, якщо я вирішу повернути Потік, куди б мій власний попередній Java-8 повернув колекцію? Чи, мабуть, я роблю тут щось антипатрійне з усім тим, що походить від приватної держави?