stream是乙個資料流通道,用來操作集合、陣列、資料來源中的序列,並生成新的集合序列,在資料流通道中會對原來的集合、陣列、資料來源中的序列進行計算,計算的結果會生成乙個新的序列,放在乙個新的源中。
運用stream操作分三步:建立stream流、流中間操作、終止流操作
注意:
1. stream本省不會儲存元素;
2. stream不會改變原**物件,相反,會返回乙個持有結果的新stream;
3. stream操作是延遲執行的,這意味著需要資料流通道的計算結果時才執行。
從建立資料來源到終止資料來源操作,中間會經過一系列的流操作,如下圖所示
下面演示中間通道流操作的篩選與切片功能
首先建立乙個list集合,作為old資料來源。
public
static listusers = arrays.aslist(
new user("lzj", 25),
new user("zhangsan", 26),
new user("lisi", 30),
new user("wanger", 18),
new user("zhaowu", 29),
new user("zhaowu", 29));
1、filter從通道流中按自定義的規則過濾出滿足條件的序列原資料來源中放置了7個user型別的物件,現在需要在通道流中過濾出年齡大於20的物件。
@test
public void test());
/*方法一:*/
// consumerconsumer = (t) -> system.out
.println(t);
// stream.foreach(consumer);
// system.out
.println("******************************");
/*方法二:*/
stream.foreach(system.out::println); //終止通道流
/*方法三:三種方式都是lambda的變形體*/
/*stream只執行一遍,就會關閉*/
// system.out
.println("------------------------------");
// stream.foreach((t) -> );
}
filter過濾方法中傳入的引數是predicate函式式介面型別的物件,通過自定義predicate介面中的test方法體來判斷過濾出符合條件的物件,test方法返回true的物件會被過濾出來。
foreach用來終止流,foreach方法中傳入的consumer函式式介面實現的物件,需要實現介面中的 void accept(t t)方法,foreach會對流中的每個元素執行acctpt方法,本案例中是對每個元素進行輸出。
執行方法,輸出結果如下:
user
[name=lzj, age=25]
user
[name=zhangsan, age=26]
user
[name=lisi, age=30]
user
[name=zhaowu, age=29]
user
[name=zhaowu, age=29]
2、截斷流,使流中元素不超過指定數量使用limit可以擷取流中指定數量的元素序列。
@test
public void test1()
執行測試方法,輸出內容如下:
user
[name=lzj, age=25]
user
[name=zhangsan, age=26]
user
[name=lisi, age=30]
從輸出結果中可以看出,只輸出了流中滿足條件的前3個。
3、skip跳過流中指定個數的序列
用skip(n)可以跳過流中的元素,返回乙個扔掉了前n個元素的流。若流中的元素不滿足n個,則返回乙個空流。與limit(n)互補。
@test
public void test2()
執行測試方法,輸出結果:
user
[name=lisi, age=30]
user
[name=zhaowu, age=29]
user
[name=zhaowu, age=29]
4、distinct去除流中重複元素通過流中元素的hashcode()和equals()方法去除流中重複的元素。
首先重寫user類中hashcode和equals方法
public
class
user
public string getname()
public
void
setname(string name)
public
intgetage()
public
void
setage(int age)
/*自動生成hashcode方法*/
@override
public
inthashcode()
/*自動生成equals方法*/
@override
public
boolean
equals(object obj) else
if (!name.equals(other.name))
return
false;
return
true;
}@override
public string tostring()
}
下面重新建立old資料來源
public
static user user1 = new user("lzj", 20);
public
static user user2 = new user("zhangsan", 30);
public
static listusers2 = arrays.aslist(user1,user1,user2);
下面用distinct去除流中重複的元素
@test
public
void
tst3()
執行測試方法,輸出結果如下:
user
[name=lzj, age=20]
user
[name=zhangsan, age=30]
Lambda表示式3 Stream的篩選與切片
流 是資料渠道,用於運算元據源 集合,陣列等 所生成的元素序列 集合講的是資料,流講的是計算 stream 自己不會儲存元素。stream 不會改變源物件。相反,他們會返回乙個持有結果的新stream。stream 操作是延遲執行的。這意味著他們會等到需要結果的時候才執行。test public v...
golang中陣列與切片的應用
加注釋擼起來 package main description 陣列與切片 author guai date 2020 2 21 9 15 import fmt math rand time func main fmt.println 雞的總重 totalweight 陣列定義和記憶體布局 定義 v...
實際應用中遇到的與stream有關的知識
實際應用中遇到的與stream有關的知識 paymentlineinfolist.stream foreach s list本身是乙個集合,要想取值,就要用到流stream,list去呼叫流,如果要是取值可以foreach 然後使用乙個變數s進行迴圈遍歷的插入值。list.parallelstrea...