Разрабатывая мой API, который не привязан к какому-либо устаревшему коду, я часто нахожу себя пишущим методы, которые являются чисто конвейерными потоками и заканчиваются сбором результатов. Как этот:
ImmutableSet<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfThing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey)
.collect(MyCustomCollectors.toImmutableSet());
}
Теперь большинству клиентов этого класса обычно требуется Collection (в данном случае ImmutableSet) для поиска элементов и итерации по нему, но некоторым клиентам может быть полезно иметь Stream, чтобы они могли передавать еще несколько операций поверх этого. Поток без необходимости получать новый поток из Коллекции. Поэтому возвращение потока дает клиентам расширенный набор опций, которые они имели бы, если бы у них была только коллекция (в конце концов, они всегда могут collect()
сами использовать поток:
Stream<T> deriveSomethingMeaningfulFromPrivateState() {
return myPrivateThingies.stream()
.map(this::ownerOfthing)
.map(Owner::socialStatus)
.filter(SocialStatus::isHeAFineMatey);
// No collect
}
Такой подход заманчив для меня, потому что я не вижу никаких потенциальных недостатков, которые он мог бы иметь. Однако я никогда не видел такого подхода ни в одной библиотеке (возможно, потому что не было много библиотек, выпущенных после появления Java 8), поэтому я немного боюсь его принять. Существующие библиотечные классы обычно возвращают Коллекции, когда они получают что-то из частного состояния.
Есть ли что-то плохое, что может случиться, если я решу вернуть поток там, где я до Java-8 вернул бы коллекцию? Или, возможно, я делаю что-то антипаттерн со всем, что происходит из частного государства?