Lambda表示式與Stream流的結合

2021-10-23 20:52:34 字數 4081 閱讀 6536

首先我們複習一下什麼是lambda表示式

舉例:

public void run (string car)
我們現在轉換成lambda表示式的形式

public void run (string car)
從上邊我們可以看出:箭頭左邊是引數,箭頭右邊是方法陣列轉換成流:

string  players = arrays.aslist("z","j","x");

stream.of(players).filter().map();

集合轉換成流:

listplayers=arrays.aslist("z","j","x");

//過濾以x開頭,並轉換成大寫的字串

players.stream().filter(s->s.startwith("x")).map(string::touppercase)

檔案轉換成流:

streamstringstream = files.lines(paths.get("file.txt"));
例:

listemployees=arrays.aslist("z","j","x");

listemployeelist = employees.stream().filter(e->e.getage()>70 && e.getgender()

.equals("m")).collect(collertors.tolist());

如果現在我們想要封裝這個lambda表示式,我們可以用謂詞進行封裝

public static predicateagegreaterthan70= x->x.getage() > 70 ;

public static predicategenderm= x-> x.getgender().equals("m");

現在我們可以用封裝好的謂詞替換上面的表示式

listemployeelist = employees.stream()

.filter(

employee.agegreaterthan70.and(employee.genderm))

.collect(collectors.tolist());

將一種格式轉換成另一種格式,從一種型別轉換成另一種型別

listwords =arrays.aslist("hello","word");

words.stream().map(s->s.split("")).collect(collectors.tolist());  //split(""):沒有分隔符

現在如果我們想把集合中的字串再進行分隔遍歷,map已經滿足不了我們的需求了,一般我們都會用巢狀for迴圈來實現,現在我們可以用flatmap代替巢狀for迴圈

words.stream().flat(s->arrays.stream(s.split(""))).collect(collectors.tolist());
步驟分解:

s->s.split("")//我們把hello和world轉換成stream流.[[h,e,l,l,o],[w,o,r,l,d]]

s->arrays.stream(s.split(""))//我們將集合再stream一下。

stream操作過程

//都是正序,不加reversed

//都是倒序,最後面乙個加reversed

//先是倒序(加reserved),然後正序

//先是正序(加reserved),然後倒序(加reserved)

::表示方法引用

default關鍵字

如何自定義方法再comparator?

anymatch():判斷stream流中是否有符合匹配規則的元素,有返回true,沒有返回false

boolean i***istagethan70 = false;

for(employee employee:employees)

}employees.stream().anymatch(s->s.getage()>70);

employees.stream().anymatch(employee.agegreaterthan70);

allmatch():判斷stream流中是否所有的元素都符合匹配規則的元素,全都符合返回true,有不符合的返回false

nonematch():判斷stream流中是否有符合匹配規則的元素,有返回false,沒有返回true

求和

listnumbers = arrays.aslist(1,2,3,4,5,6);

//reduce(初始值,歸約表示式)

//subtotal:階段性結果1、3、6、10、15、21

//element:當前值

integer total = numbers.stream().reduce(0,(subtotal,element)->subtotal + element);

另一種方法,利用方法引用

integer total = numbers.stream().reduce(0,integer::sum);
字串操作

listletters=arrays.aslist("a","b","c","d","e");

//第一種方式

string astr = letters.stream().reduce("",string::concat);

//第二種方式

string astr = letters.stream().reduce("",(subtotal,element)->subtotal.concat(element));

system.out.println(astr);

求和員工的年齡

//map將員工物件轉換成年齡

integer tage = employees.stream().map(employee::getage).reduce(0,integer::sum)

並行流的執行過程

合併器:reduce(初始值,累加器,合併器);當遍歷元素和最後累加結果型別不匹配的時候它可以用來對階段性累加結果進行合併(二次歸約、型別轉換)

並行操作:

integer tage2 = employees.parallelstream().

.map(employee::getage)

.reduce(0,integer::sum,integer::sum);

integer tage3 = employees.stream()

.reduce(0,(subtotal,emp)->subtotal+emp.getage(),integer::sum);

lambda表示式 lambda表示式

1.概述 c 11 中的 lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda 的語法形式如下 函式物件引數 操作符過載函式引數 mutable 或 exception 宣告 返回值型別可以看到,lambda 主要分為五個部分 函式物件引數 操作符過載函式引數 muta...

Lambda表示式和Lambda表示式樹

原版來自 linq學習筆記之二 lambda表示式和lambda表示式樹 lambda 表示式 lambda expressions 是linq實現的另一特性。lambda表示式的作用就是使用使用函式式語法,將方法實現關聯到委託例項。在使用查詢表示式 query expressions 時,查詢表示...

LINQ與Lambda表示式

是微軟提出的一項新技術 能將查詢功能直接引入到.net framwork所支援的程式語言中。查詢操作可以通過程式語言自身來傳達,而不用以字串形式嵌入到 中。主要包括linq to sql,linq to dataset,linq to objects和linq to xml4種技術。在c 後期版本中...