流API 縮減操作

2021-07-07 02:25:03 字數 1829 閱讀 7288

在stream流操作中,比如說min(),max(),count()方法,這幾個操作都會將乙個流縮減成乙個值,流api將這些操作稱為特例縮減。另外,流api同時泛華了縮減這種概念,提供了reduce()方法,通過使用reduce()方法,可以基於任意條件,從流中返回乙個值。根據定義,所有縮減操作都是終端操作。

我們先來翻下api:

optionalreduce(binaryoperatoraccumulator) :performs a reduction on the elements of this stream, using an associative accumulation function, and returns an optional describing the reduced value, if any. 

t reduce(t identity, binaryoperatoraccumulator) :performs a reduction on the elements of this stream, using the provided identity value and an associative accumulation function, and returns the reduced value.

u reduce(u identity, bifunctionaccumulator, binaryoperatorcombiner):performs a reduction on the elements of this stream, using the provided identity, accumulation and combining functions.

先來看一段**演示下如果對乙個流做縮減操作:

public static void main(string args) throws exception

這裡我們重點要看下前面2個方法:

optionalreduce(binaryoperatoraccumulator)

t reduce(t identity, binaryoperatoraccumulator)

第乙個方法返回乙個optional物件,該物件包含了結果。第二個方法直接返回t型別的物件,這裡的這個t型別就是流中元素的型別。在使用這2個方法的時候,要傳入乙個lambda表示式,這個表示式要實現binaryoperator函式式介面,先說下這個介面吧:具體的可以去看我前面有篇部落格的,這些函式式介面很容易忘掉了,我暈。

public inte***ce binaryoperatorextends bifunction{}

注意:累加器操作必須滿足以下3個約束:

1,無狀態

2,不干預

3,結合性

無狀態意味著操作不依賴於任何狀態資訊,不干預意味著操作不會改變資料來源,最後操作必須具有關聯性。這裡的關聯性可以理解為加法結合律或者乘法結合律,舉個例子,(a+b)+c=a+(b+c);

reduce(u identity, bifunctionaccumulator, binaryoperatorcombiner)。

考慮如下情景:假設我們現在有乙個包含多個物件的流,並且希望對他們的某個屬性進行求和。例如求乙個流中的所有字串的總長度,這個時候我們沒有辦法用上面的2個reduce的過載,因為上面2個方法中需要乙個(t,t)->t這樣子的函式式介面,但是這裡這2個型別是不同的,流中的元素是string的,但是累加的結果是整型的。對於這種情況,我們只能使用過載的第3個方法了。

public static void main(string args)

資料操作流 記憶體操作流 列印流

資料操作流 目前基本沒用 datasource.自己查詢把 記憶體操作流 用來處理臨時儲存資訊的,程式結束時,資料就從記憶體中消失 操作位元組 bytearrayoutputstream 輸出流 寫入操作 bytearrayinputstream 輸入流 讀取資料 字元陣列 chararrayrea...

執行緒操作API

獲取執行緒資訊 thread提供了獲取執行緒資訊的相關方法 long getid 返回該執行緒的識別符號 string getname 返回該執行緒的名稱 int getpriority 返回執行緒的優先順序 thread.state getstate 獲取執行緒的狀態 boolean isaliv...

activiti工作流常用api

1 繫結啟動流程的當前使用者 在啟動流程時,先呼叫 下面的api 來繫結流程啟動人 identityservice.setauthenticateduserid user 2 獲取流程例項的啟動人 public string getstartuserid string taskid 3 使用任務id...