Мне постоянно говорят, что это плохая практика - не прерывать поток с помощью таких методов, как collect и findFirst, но никакой реальной обратной связи относительно того, почему об этом не так много говорится в блогах.
Это действительно зависит от контекста , если вы говорите "могу ли я завершить поток промежуточной операцией, например filter
, и не вызывать терминальную операцию (операцию, которая потребляет поток) когда-либо "тогда да, это плохая практика и бессмысленная, потому что вы только что определили некоторые критерии, но никогда не спрашивали о" результате "
Потоки ленивы в том смысле, что они ничего не делают, если это не указано в терминальной операции, например, collect
, findFirst
и т. Д.
Если вы говорите, "это так"плохая практика - возвращать поток из метода "тогда, возможно, стоит прочитать этот ответ о том, должен ли один возвращать поток или коллекцию .
Далее, обратите внимание, что ваша логика getBeanViaOptional
работает на Optional<T>
, а не Stream<T>
.Да, они оба имеют map
, flatMap
и filter
, но обратите внимание, что Optional<T>
может содержать только одно значение или пусто , тогда как поток может иметь один илиБольше.
Ваш подход использования Optional вместо императивного if
s явно лучше с точки зрения читабельности, обслуживания и т. Д., Поэтому я бы посоветовал вам продолжить этот подход, хотя вы можете немного его улучшитьбит с помощью orElseThrow
т.е.:
return Optional.ofNullable(bean)
.map(RequestBean::getFruitBeans)
.map(n -> n.get(0))
.map(FruitBean::getAnotherBeans)
.map(n -> n.get(0))
.map(AnotherBean::getInnerBeans)
.map(n -> n.get(0))
.map(InnerBean::getBeans)
.filter(n -> n.contains("apple"))
.orElseThrow(CustomException::new);