日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java 8系列之Stream中万能的reduce

發(fā)布時間:2025/3/21 java 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java 8系列之Stream中万能的reduce 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Stream系列:

  • Java 8系列之Stream的基本語法詳解
  • Java 8系列之Stream的強大工具Collector
  • Java 8系列之重構(gòu)和定制收集器
  • Java 8系列之Stream中萬能的reduce?

reduce 操作可以實現(xiàn)從Stream中生成一個值,其生成的值不是隨意的,而是根據(jù)指定的計算模型。比如,之前提到count、min和max方法,因為常用而被納入標準庫中。事實上,這些方法都是reduce操作。

reduce方法有三個override的方法:

  • Optional<T> reduce(BinaryOperator<T> accumulator);
  • T reduce(T identity, BinaryOperator<T> accumulator);
  • <U> U reduce(U identity,BiFunction<U, ? super T, U> accumulator,BinaryOperator<U> combiner);

我們先看第一個變形,其接受一個函數(shù)接口BinaryOperator<T>,而這個接口又繼承于BiFunction<T, T, T>.在BinaryOperator接口中,又定義了兩個靜態(tài)方法minBy和maxBy。這里我們先不管這兩個靜態(tài)方法,先了解reduce的操作。

@FunctionalInterface public interface BinaryOperator<T> extends BiFunction<T,T,T> {public static <T> BinaryOperator<T> minBy(Comparator<? super T> comparator) {Objects.requireNonNull(comparator);return (a, b) -> comparator.compare(a, b) <= 0 ? a : b;}public static <T> BinaryOperator<T> maxBy(Comparator<? super T> comparator) {Objects.requireNonNull(comparator);return (a, b) -> comparator.compare(a, b) >= 0 ? a : b;} }

在使用時,我們可以使用Lambda表達式來表示

BinaryOperator接口,可以看到reduce方法接受一個函數(shù),這個函數(shù)有兩個參數(shù),第一個參數(shù)是上次函數(shù)執(zhí)行的返回值(也稱為中間結(jié)果),第二個參數(shù)是stream中的元素,這個函數(shù)把這兩個值相加,得到的和會被賦值給下次執(zhí)行這個函數(shù)的第一個參數(shù)。要注意的是:第一次執(zhí)行的時候第一個參數(shù)的值是Stream的第一個元素,第二個參數(shù)是Stream的第二個元素。這個方法返回值類型是Optional,

Optional accResult = Stream.of(1, 2, 3, 4).reduce((acc, item) -> {System.out.println("acc : " ?+ acc);acc += item;System.out.println("item: " + item);System.out.println("acc+ : " ?+ acc);System.out.println("--------");return acc;}); System.out.println("accResult: " + accResult.get()); System.out.println("--------"); // 結(jié)果打印 -------- acc : 1 item: 2 acc+ : 3 -------- acc : 3 item: 3 acc+ : 6 -------- acc : 6 item: 4 acc+ : 10 -------- accResult: 10 --------

下面來看第二個變形,與第一種變形相同的是都會接受一個BinaryOperator函數(shù)接口,不同的是其會接受一個identity參數(shù),用來指定Stream循環(huán)的初始值。如果Stream為空,就直接返回該值。另一方面,該方法不會返回Optional,因為該方法不會出現(xiàn)null。

int accResult = Stream.of(1, 2, 3, 4).reduce(0, (acc, item) -> {System.out.println("acc : " ?+ acc);acc += item;System.out.println("item: " + item);System.out.println("acc+ : " ?+ acc);System.out.println("--------");return acc;}); System.out.println("accResult: " + accResult); System.out.println("--------"); // 結(jié)果打印 acc : 0 item: 1 acc+ : 1 -------- acc : 1 item: 2 acc+ : 3 -------- acc : 3 item: 3 acc+ : 6 -------- acc : 6 item: 4 acc+ : 10 -------- accResult: 10 --------

從打印結(jié)果可以看出,reduce前兩種變形,因為接受參數(shù)不同,其執(zhí)行的操作也有相應變化:

變形1,未定義初始值,從而第一次執(zhí)行的時候第一個參數(shù)的值是Stream的第一個元素,第二個參數(shù)是Stream的第二個元素
變形2,定義了初始值,從而第一次執(zhí)行的時候第一個參數(shù)的值是初始值,第二個參數(shù)是Stream的第一個元素
對于第三種變形,我們先看各個參數(shù)的含義,第一個參數(shù)返回實例u,傳遞你要返回的U類型對象的初始化實例u,第二個參數(shù)累加器accumulator,可以使用二元?表達式(即二元lambda表達式),聲明你在u上累加你的數(shù)據(jù)來源t的邏輯,例如(u,t)->u.sum(t),此時lambda表達式的行參列表是返回實例u和遍歷的集合元素t,函數(shù)體是在u上累加t,第三個參數(shù)組合器combiner,同樣是二元?表達式,(u,t)->u。在官方文檔上有這么一段介紹,

U result = identity;?

for (T element : this stream)?

????????result = accumulator.apply(result, element)?

return result;

but is not constrained to execute sequentially.

The identity value must be an identity for the combiner function. This means that for all u, combiner(identity, u) is equal to u. Additionally, the combiner function must be compatible with the accumulator function; for all u and t, the following must hold:

combiner.apply(u, accumulator.apply(identity, t)) == accumulator.apply(u, t)

因為reduce的變形的第一個參數(shù)類型是實際返回實例的數(shù)據(jù)類型,同時其為一個泛型也就是意味著該變形的可以返回任意類型的數(shù)據(jù)。從上面文檔介紹的字面意思解讀是第三個參數(shù)函數(shù)用來組合兩個值,而這兩個值必須與第二個函數(shù)參數(shù)相兼容,也就是說它們所得的結(jié)果是一樣的。看到這里肯定有迷惑的地方,第三個參數(shù)到底是用來干嘛的?我們先看一段代碼,為了便于了解其中的緣由,并沒有使用Lambda表達式,

ArrayList<Integer> accResult_ = Stream.of(1, 2, 3, 4).reduce(new ArrayList<Integer>(),new BiFunction<ArrayList<Integer>, Integer, ArrayList<Integer>>() {@Overridepublic ArrayList<Integer> apply(ArrayList<Integer> acc, Integer item) {acc.add(item);System.out.println("item: " + item);System.out.println("acc+ : " + acc);System.out.println("BiFunction");return acc;}}, new BinaryOperator<ArrayList<Integer>>() {@Overridepublic ArrayList<Integer> apply(ArrayList<Integer> acc, ArrayList<Integer> item) {System.out.println("BinaryOperator");acc.addAll(item);System.out.println("item: " + item);System.out.println("acc+ : " + acc);System.out.println("--------");return acc;}}); System.out.println("accResult_: " + accResult_); // 結(jié)果打印 item: 1 acc+ : [1] BiFunction item: 2 acc+ : [1, 2] BiFunction item: 3 acc+ : [1, 2, 3] BiFunction item: 4 acc+ : [1, 2, 3, 4] BiFunction accResult_: [1, 2, 3, 4] accResult_: 10

首先示例代碼中,傳遞給第一個參數(shù)是ArrayList,在第二個函數(shù)參數(shù)中打印了“BiFunction”,而在第三個參數(shù)的函數(shù)接口中打印了”BinaryOperator“.可是,看打印結(jié)果,只是打印了“BiFunction”,而沒有打印”BinaryOperator“,說明第三個函數(shù)參數(shù)并沒有執(zhí)行。這里我們知道了該變形可以返回任意類型的數(shù)據(jù)。對于第三個函數(shù)參數(shù),為什么沒有執(zhí)行,剛開始的時候也是沒有看懂到底是啥意思呢,而且其參數(shù)必須為返回的數(shù)據(jù)類型?看了好幾遍文檔也是一頭霧水。在 java8 reduce方法中的第三個參數(shù)combiner有什么作用?這里找到了答案,Stream是支持并發(fā)操作的,為了避免競爭,對于reduce線程都會有獨立的result,combiner的作用在于合并每個線程的result得到最終結(jié)果。這也說明了了第三個函數(shù)參數(shù)的數(shù)據(jù)類型必須為返回數(shù)據(jù)類型了。


需要注意的是,因為第三個參數(shù)用來處理并發(fā)操作,如何處理數(shù)據(jù)的重復性,應多做考慮,否則會出現(xiàn)重復數(shù)據(jù)!
---------------------?
作者:行云間?
來源:CSDN?
原文:https://blog.csdn.net/IO_Field/article/details/54971679?
版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上博文鏈接!

總結(jié)

以上是生活随笔為你收集整理的Java 8系列之Stream中万能的reduce的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久久久成人精品无码 | 国产精品一区二区三区四区 | 久久久久人妻一道无码AV | 制服丝袜先锋影音 | 三上悠亚中文字幕在线播放 | 中文字幕国产日韩 | 致命魔术电影高清在线观看 | 欧美狠狠干 | 福利第一页 | 国产美女一区二区 | 免费av高清| 久久精彩视频 | 国产精品久久亚洲 | 在线观看你懂的网站 | 欧美亚州 | 中文字幕第四页 | 欧美一区二区三区成人 | xxxx999| 一区二区三区欧美日韩 | 欧美精品另类 | 中国精品一区二区 | 精品国产一区二区在线观看 | 国产又黄又粗 | 欧美久久一区二区三区 | 国产午夜久久 | 深夜网站在线观看 | 少妇精品久久久久久久久久 | 寂寞午夜影院 | 午夜影院免费视频 | 久草视频免费在线播放 | 红桃视频隐藏入口 | 99热91| 亚洲丝袜av | 打屁股疼的撕心裂肺的视频 | 69久久 | av有声小说一区二区三区 | а√在线中文网新版地址在线 | a级淫片 | 性感美女在线 | 欧美激情综合 | 精品无码久久久久久国产 | 国产日韩欧美视频在线 | 91蜜桃| 秋霞av鲁丝片一区二区 | 丰满秘书被猛烈进入高清播放在 | 国产第一精品视频 | 国产精品成人无码专区 | av色图 | 亚洲伦理一区二区 | 精品国产一区二区三区性色av | 永久免费AV无码网站韩国毛片 | 黄色一级一片免费播放 | 精品国产制服丝袜高跟 | 国产另类专区 | 日韩二级片 | 成人免费播放视频 | 国产一级特黄毛片 | 日剧再来一次第十集 | 男男gay做受xx | 色婷婷综合久久久久中文字幕 | 久久久久亚洲av无码专区桃色 | 亚洲精品a级| 欧美激情一区二区三区 | 一区二区看片 | 在线干| 国产奶头好大揉着好爽视频 | 欧美99 | 国产a√精品区二区三区四区 | 电影桑叶2在线播放完整版 222aaa | 免费视频91 | www在线观看视频 | 国产精品一区二区人人爽 | 欧美精品首页 | 欧美性第一页 | 欧美日韩激情在线一区二区三区 | 五月天开心网 | 中文字幕第一区综合 | 日韩欧美激情视频 | aaa黄色大片| 亚洲插 | 亚洲欲妇 | 亚洲高清在线观看 | 日韩美女爱爱 | 超碰在线97观看 | 波多野结衣av无码 | 岛国av噜噜噜久久久狠狠av | 91天天色| 综合av网 | 深爱激情站 | 女人裸体又黄 | 91在线精品李宗瑞 | 手机av在线播放 | 青青久在线 | 一本色道久久亚洲综合精品蜜桃 | 麻豆精品国产 | 日本三级一区二区三区 | 日韩av手机在线免费观看 | 国产日韩精品久久 | 成年人晚上看的视频 |