java8 Stream API之reduce使用說(shuō)明
本篇我們只講reduce。
reduce的作用是把stream中的元素給組合起來(lái)。
至于怎么組合起來(lái):它需要我們首先提供一個(gè)起始種子,然后依照某種運(yùn)算規(guī)則使其與stream的第一個(gè)元素發(fā)生關(guān)系產(chǎn)生一個(gè)新的種子,這個(gè)新的種子再緊接著與stream的第二個(gè)元素發(fā)生關(guān)系產(chǎn)生又一個(gè)新的種子,就這樣依次遞歸執(zhí)行,最后產(chǎn)生的結(jié)果就是reduce的最終產(chǎn)出,這就是reduce的算法最通俗的描述;
那么結(jié)合實(shí)際的業(yè)務(wù)場(chǎng)景來(lái)說(shuō),運(yùn)用reduce我們可以做sum,min,max,average,所以這些我們稱之為針對(duì)具體應(yīng)用場(chǎng)景的reduce,這些常用的reduce,stream api已經(jīng)為我們封裝了對(duì)應(yīng)的方法。
以下給出一些具體應(yīng)用場(chǎng)景的reduce實(shí)現(xiàn)方式:
sum
@Test
public void testSum() {
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
// 沒(méi)有起始值時(shí)返回為Optional類(lèi)型
Optional<Integer> sumOptional = integers.stream().reduce(Integer::sum);
System.out.println(sumOptional.get());
// 可以給一個(gè)起始種子值
Integer sumReduce = integers.stream().reduce(0, Integer::sum);
System.out.println(sumReduce);
//直接用sum方法
Integer sum = integers.stream().mapToInt(i -> i).sum();
System.out.println(sum);
}
concat
@Test
public void testConcat() {
//構(gòu)造字符串流
List<String> strs = Arrays.asList("H", "E", "L", "L", "O");
// reduce
String concatReduce = strs.stream().reduce("", String::concat);
System.out.println(concatReduce);
}
min
@Test
public void testMin() {
//min reduce
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
Integer minReduce = integerStream.reduce(Integer.MAX_VALUE, Integer::min);
System.out.println(minReduce);
// min
Stream<Integer> integerStream1 = Stream.of(1, 2, 3, 4, 5);
OptionalInt min = integerStream1.mapToInt(i -> i).min();
System.out.println(min.getAsInt());
}
max
@Test
public void testMax() {
//max reduce
Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5);
Integer maxReduce = integerStream.reduce(Integer.MIN_VALUE, Integer::max);
System.out.println(maxReduce);
// max
Stream<Integer> integerStream1 = Stream.of(1, 2, 3, 4, 5);
OptionalInt max = integerStream1.mapToInt(i -> i).max();
System.out.println(max.getAsInt());
}
ok,相信大家已經(jīng)對(duì)reduce有所了解!
補(bǔ)充知識(shí):了解Java JNI及動(dòng)態(tài)鏈接庫(kù)
提到Java JNI不得不提到動(dòng)態(tài)鏈接庫(kù),在window操作系統(tǒng)中一般為后綴為DLL的文件,在Linux中為.so文件。動(dòng)態(tài)鏈接庫(kù)的作用在于為多個(gè)應(yīng)用程序提供相同的函數(shù)功能,以此達(dá)到節(jié)省代碼量,節(jié)省內(nèi)存,共享相關(guān)數(shù)據(jù)、系統(tǒng)資源的作用。
Java的JNI則是為了對(duì)接這種功能的技術(shù)。
Java中的一個(gè)方法申明為native時(shí),是不會(huì)直接用java代碼去做實(shí)現(xiàn)的,因?yàn)閚ative方法就是通過(guò)JNI去調(diào)用動(dòng)態(tài)庫(kù)。JDK中有很多native方法,通常涉及到一些底層技術(shù),系統(tǒng)資源相關(guān)。
以上這篇java8 Stream API之reduce使用說(shuō)明就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Springboot 跨域配置無(wú)效及接口訪問(wèn)報(bào)錯(cuò)的解決方法
這篇文章主要介紹了Springboot 跨域配置無(wú)效及接口訪問(wèn)報(bào)錯(cuò)的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12
解決idea導(dǎo)入ssm項(xiàng)目啟動(dòng)tomcat報(bào)錯(cuò)404的問(wèn)題
今天小編就為大家分享一篇解決idea導(dǎo)入ssm項(xiàng)目啟動(dòng)tomcat報(bào)錯(cuò)404的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
SpringBoot深入分析運(yùn)行原理與功能實(shí)現(xiàn)
我們發(fā)現(xiàn)springBoot程序開(kāi)發(fā)比spring程序編寫(xiě)起來(lái)容易的多。配置簡(jiǎn)潔,依賴關(guān)系簡(jiǎn)單,啟動(dòng)運(yùn)行容易。那么結(jié)下了我們我們就要思考一下入門(mén)程序中的這些功能是怎么實(shí)現(xiàn)的2022-09-09
Struts2學(xué)習(xí)筆記(3)-DMI動(dòng)態(tài)調(diào)用方式
本文主要介紹Struts2的DMI動(dòng)態(tài)調(diào)用的兩種方式,簡(jiǎn)單實(shí)用,希望能給大家做一個(gè)參考。2016-06-06
Spring Boot Admin管理監(jiān)控?cái)?shù)據(jù)的方法
本篇文章主要介紹了Spring Boot Admin管理監(jiān)控?cái)?shù)據(jù)的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
Springboot+TCP監(jiān)聽(tīng)服務(wù)器搭建過(guò)程圖解
這篇文章主要介紹了Springboot+TCP監(jiān)聽(tīng)服務(wù)器搭建過(guò)程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10
教你利用JAVA實(shí)現(xiàn)可以自行關(guān)閉服務(wù)器的方法
今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著利用JAVA實(shí)現(xiàn)可以自行關(guān)閉服務(wù)器的方法展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06
MyBatis Mapper XML中比較操作符轉(zhuǎn)義問(wèn)題解決
在使用MyBatis編寫(xiě)Mapper XML時(shí),有時(shí)會(huì)遇到比較操作符需要進(jìn)行轉(zhuǎn)義的情況,本文主要介紹了MyBatis Mapper XML中比較操作符轉(zhuǎn)義問(wèn)題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01

