я где-то читал, что Stream никогда не должен быть типом возврата метода
Не уверен, где вы читаете, что Stream
никогда не должно быть типом возврата метода.(Можете ли вы обновить свой вопрос со ссылкой?).
Наоборот, Брайан Гетц, один из разработчиков Stream API, явно думает иначе:
https://stackoverflow.com/a/24679745/340088
(звонящий не знаетесли этот метод уже использует поток или нет)
Если вызывающая сторона получает Stream
, подразумевается, что поток пригоден для использования.Если вы возвращаете израсходованный Stream
, это все равно что вернуть закрытый Socket
или закрытый InputStream
.Хотя это возможно синтаксически, это просто плохое кодирование.Это не значит, что вы не должны возвращать Socket
или InputStream
из метода только потому, что какой-то плохой кодер иногда возвращает его в плохом состоянии.
Напротив, объекты монадического стиля предназначены длябыть возвращенным.Stream
, Optional
, CompletableFuture
и все функциональные интерфейсы (Function
, Consumer
, Operator
и т. Д.) Предназначены для возврата, чтобы к ним можно было присоединить больше операций в функциональном стилебез фактического выполнения функции на месте.
Пример, который вы разместили для меня, вполне обоснован.Вы как бы украшаете свой Stream
дополнительными операциями для конвейера.Вы можете иметь логику, которая решает, какие операции добавляются в конвейер, и нет никаких причин, почему бы не инкапсулировать их должным образом в маленькие методы.
Кроме того, если поток очень большой, содержащий сотни тысяч элементов, если вы вернете коллекцию, вы просто создадите огромную коллекцию в памяти, что повлечет за собой затраты на добавление их всех, а затем в поток.их снова, чтобы записать их в файл.Не имеет особого смысла, не так ли?