2 回答

TA貢獻1818條經驗 獲得超8個贊
我不斷被告知不通過諸如collect和findFirst之類的方法終止Stream是不好的做法,但沒有真正的反饋說明為什么在博客中沒有太多談論它。
這實際上取決于上下文,如果您說“我可以用中間操作結束流,例如filter
而不調用終端操作(消耗流的操作) ”那么是的,這是不好的做法并且毫無意義,因為您只是定義了一些標準,但從未要求“結果”。
流是惰性的,因為它們不會執行任何操作,除非終端操作(例如 等)告知這樣collect
做findFirst
。
如果您說“從方法返回流是一種不好的做法嗎”,那么可能值得閱讀有關是否應該返回流或集合的答案。
此外,請注意您的getBeanViaOptional
邏輯是在Optional<T>
a 而不是上運行的Stream<T>
。是的,它們都有map
,flatMap
但filter
請注意, anOptional<T>
只能包含一個值或者為空,而流可以包含一個或多個值。
您使用Optional而不是命令式的方法if
在可讀性、維護等方面顯然更好。所以我建議您繼續使用這種方法,盡管您可以使用orElseThrow
ie 來改進它:
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);

TA貢獻1752條經驗 獲得超4個贊
對于流,當沒有終端操作時,通常不會執行任何中間操作。您的示例使用Optional
. 它的操作map
和filter
流中的一些中間操作同名,但又不同。您的示例在您的問題所詢問的行上是可以的(不錯的做法)。
另一件事是(正如 Aomine 已經指出的那樣).orElseThrow
是獲取 中的值Optional
并在沒有值時拋出異常的更短方法。更重要的是使用起來更安全.orElseThrow
(或者.orElse
如果有默認值)。Optional.get()
應盡可能避免。NoSuchElementException
如果沒有值,您將得到 a 。NullPointerException
這幾乎和不使用時得到 a 一樣糟糕Optional
。Optional
以正確的方式使用可以保護您免受NullPointerException
.
添加回答
舉報