簡體   English   中英

有狀態和無狀態的流方法

[英]stateful and stateless methods of stream

在界面Stream中:

中間操作可分為有狀態和無狀態。 它們會影響並行Stream的結果。

只有兩個終端操作是非確定性方法:findAny()和forEach(Consumer)。 它們會影響並行Stream的結果。

如果中間無狀態操作執行延遲操作,則可能產生副作用。 這會影響並行Stream的結果。

中間操作可分類為:

有狀態

  • 不同()
  • 排序()
  • 限制(長l)
  • 跳過(長l)

無狀態

  • 地圖(功能f)
  • flatMap(功能f)
  • 過濾器(謂詞p)
  • 偷看(消費者c)

這是我的兩個問題:

  1. 無狀態中間方法

    • 如果我在並行流+非確定性forEach()上調用無狀態中間方法,我將獲得順序流的相同結果,但順序不同。
    • 如果我在並行流+非確定性findAny()上調用無狀態中間方法,我將獲得不可預測的結果。
    • 如果我在並行流+普通終端操作上調用無狀態中間方法,我將獲得順序流的相同結果。
    • 如果我在並行流上調用無狀態中間方法+具有副作用的正常終端操作,我將獲得不可預測的結果。
  2. 有狀態的中間方法

    • 如果我調用有狀態中間方法+非確定性forEach(),我將獲得順序流的相同結果,但順序不同。
    • 如果我調用有狀態的中間方法+非確定性的findAny(),我將得到一個不可預測的結果。
    • 如果我調用有狀態中間方法+正常終端操作,我將獲得順序流的相同結果。

這些規則是否正確?

  1. Stream元素的順序是“遇到順序”,除非我調用BaseStream方法:unordered()。 元素的順序是否會影響流的結果(存在有狀態或無狀態方法)? 如果有,怎么樣?

非常感謝!

一種。

我想條件1和2都是正確的。 我想添加一些操作。

reduce也是有狀態操作的一部分。

forEach是無國籍行動的一部分。

請注意,無狀態操作如果產生副作用,可能會變為有狀態。

第三種說法並不完全正確。 如果訂購了一個流並且我們並行處理它,那么當與無狀態操作一起使用時,該流將保持有序。 這就是為什么我們需要在流上調用unordered()方法來使其無序並提高效率。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM