java理論基礎(chǔ)Stream?reduce實(shí)現(xiàn)集合元素歸約
Stream API為我們提供了Stream.reduce
用來實(shí)現(xiàn)集合元素的歸約。reduce函數(shù)有三個(gè)參數(shù):
Identity
標(biāo)識(shí):一個(gè)元素,它是歸約操作的初始值,如果流為空,則為默認(rèn)結(jié)果。
Accumulator
累加器:具有兩個(gè)參數(shù)的函數(shù):歸約運(yùn)算的部分結(jié)果和流的下一個(gè)元素。
Combiner
合并器(可選):當(dāng)歸約并行化時(shí),或當(dāng)累加器參數(shù)的類型與累加器實(shí)現(xiàn)的類型不匹配時(shí),用于合并歸約操作的部分結(jié)果的函數(shù)。
注意觀察上面的圖,我們先來理解累加器:
階段累加結(jié)果作為累加器的第一個(gè)參數(shù)
集合遍歷元素作為累加器的第二個(gè)參數(shù)
Integer類型歸約
reduce初始值為0,累加器可以是lambda表達(dá)式,也可以是方法引用。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6); int result = numbers .stream() .reduce(0, (subtotal, element) -> subtotal + element); System.out.println(result); //21 int result = numbers .stream() .reduce(0, Integer::sum); System.out.println(result); //21
String類型歸約
不僅可以歸約Integer類型,只要累加器參數(shù)類型能夠匹配,可以對(duì)任何類型的集合進(jìn)行歸約計(jì)算。
List<String> letters = Arrays.asList("a", "b", "c", "d", "e"); String result = letters .stream() .reduce("", (partialString, element) -> partialString + element); System.out.println(result); //abcde String result = letters .stream() .reduce("", String::concat); System.out.println(result); //ancde
復(fù)雜對(duì)象歸約
計(jì)算所有的員工的年齡總和。
Employee e1 = new Employee(1,23,"M","Rick","Beethovan"); Employee e2 = new Employee(2,13,"F","Martina","Hengis"); Employee e3 = new Employee(3,43,"M","Ricky","Martin"); Employee e4 = new Employee(4,26,"M","Jon","Lowman"); Employee e5 = new Employee(5,19,"F","Cristine","Maria"); Employee e6 = new Employee(6,15,"M","David","Feezor"); Employee e7 = new Employee(7,68,"F","Melissa","Roy"); Employee e8 = new Employee(8,79,"M","Alex","Gussin"); Employee e9 = new Employee(9,15,"F","Neetu","Singh"); Employee e10 = new Employee(10,45,"M","Naveen","Jain"); List<Employee> employees = Arrays.asList(e1, e2, e3, e4, e5, e6, e7, e8, e9, e10); Integer total = employees.stream().map(Employee::getAge).reduce(0,Integer::sum); System.out.println(total); //346
先用map將Stream流中的元素由Employee類型處理為Integer類型(age)。
然后對(duì)Stream流中的Integer類型進(jìn)行歸約
Combiner合并器的使用
除了使用map函數(shù)實(shí)現(xiàn)類型轉(zhuǎn)換后的集合歸約,我們還可以用Combiner合并器來實(shí)現(xiàn),這里第一次使用到了Combiner合并器。 因?yàn)镾tream流中的元素是Employee,累加器的返回值是Integer,所以二者的類型不匹配。這種情況下可以使用Combiner合并器對(duì)累加器的結(jié)果進(jìn)行二次歸約,相當(dāng)于做了類型轉(zhuǎn)換。
Integer total3 = employees.stream() .reduce(0,(totalAge,emp) -> totalAge + emp.getAge(),Integer::sum); //注意這里reduce方法有三個(gè)參數(shù) System.out.println(total); //346
計(jì)算結(jié)果和使用map進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換的方式是一樣的。
并行流數(shù)據(jù)歸約(使用合并器)
對(duì)于大數(shù)據(jù)量的集合元素歸約計(jì)算,更能體現(xiàn)出Stream并行流計(jì)算的威力。
在進(jìn)行并行流計(jì)算的時(shí)候,可能會(huì)將集合元素分成多個(gè)組計(jì)算。為了更快的將分組計(jì)算結(jié)果累加,可以使用合并器。
Integer total2 = employees .parallelStream() .map(Employee::getAge) .reduce(0,Integer::sum,Integer::sum); //注意這里reduce方法有三個(gè)參數(shù) System.out.println(total); //346
以上就是java理論基礎(chǔ)Stream reduce實(shí)現(xiàn)集合元素歸約的詳細(xì)內(nèi)容,更多關(guān)于java Stream reduce集合元素歸約的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java中Scanner類與BufferReader類的不同點(diǎn)(非常詳細(xì))
這篇文章主要介紹了Java中Scanner類與BufferReader類的不同點(diǎn)(非常詳細(xì))的相關(guān)資料,需要的朋友可以參考下2016-08-08java對(duì)象類型轉(zhuǎn)換和多態(tài)性(實(shí)例講解)
下面小編就為大家?guī)硪黄猨ava對(duì)象類型轉(zhuǎn)換和多態(tài)性(實(shí)例講解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-10-10SpringCloud Feign遠(yuǎn)程調(diào)用實(shí)現(xiàn)詳解
Feign是Netflix公司開發(fā)的一個(gè)聲明式的REST調(diào)用客戶端; Ribbon負(fù)載均衡、 Hystrⅸ服務(wù)熔斷是我們Spring Cloud中進(jìn)行微服務(wù)開發(fā)非?;A(chǔ)的組件,在使用的過程中我們也發(fā)現(xiàn)它們一般都是同時(shí)出現(xiàn)的,而且配置也都非常相似2022-11-11利用Spring boot如何創(chuàng)建簡(jiǎn)單的web交互應(yīng)用
這篇文章主要介紹了利用Spring boot如何創(chuàng)建簡(jiǎn)單的web交互應(yīng)用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來一起看看吧。2017-04-04詳解Spring框架注解掃描開啟之配置細(xì)節(jié)
本篇文章主要介紹了詳解Spring框架注解掃描開啟之配置細(xì)節(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08Swift洗牌動(dòng)畫效果的實(shí)現(xiàn)方法
這篇文章主要介紹了Swift洗牌動(dòng)畫效果的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2016-12-12