日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

一文搞懂 Java8 reduce操作

來源: 責編: 時間:2023-12-21 17:11:55 230觀看
導讀什么是 reduceJava8 中有兩大最為重要的改變,其一是 Lambda 表達式,另一個就是 Stream API 了。Stream 是 Java8 中處理集合的關鍵抽象概念,它將數據源流化后,可以執行非常復雜的查找、過濾和映射數據、排序、切片、聚合

什么是 reduce

Java8 中有兩大最為重要的改變,其一是 Lambda 表達式,另一個就是 Stream API 了。1GC28資訊網——每日最新資訊28at.com

Stream 是 Java8 中處理集合的關鍵抽象概念,它將數據源流化后,可以執行非常復雜的查找、過濾和映射數據、排序、切片、聚合統計等操作。操作之后會產生一個新的流,而數據源則不會發生改變。1GC28資訊網——每日最新資訊28at.com

在使用 Stream 操作的過程中,往往有三個步驟,1GC28資訊網——每日最新資訊28at.com

1. 創建 Stream

從一個數據源(集合,數組)中,新建一個 Stream 流。1GC28資訊網——每日最新資訊28at.com

2. 中間操作

一個中間操作鏈,對 Stream 流的數據進行處理。比如查找、過濾、映射轉換等。1GC28資訊網——每日最新資訊28at.com

3. 終止操作

一個終止操作,執行中間操作鏈,并產生結果。常用的終止操作有 forearch、collect、match、count、min、max、reduce 等。1GC28資訊網——每日最新資訊28at.com

其中本文主要講解的 reduct 操作就屬于是 Stream 流操作中的終止操作。1GC28資訊網——每日最新資訊28at.com

reduce 操作是一種通用的歸約操作,它可以實現從 Stream 中生成一個值,其生成的值不是隨意的,而是根據指定的計算模型。1GC28資訊網——每日最新資訊28at.com

比如終止操作中提到 count、min 和 max 方法,因為常用而被納入標準庫中。事實上這些方法都是一種 reduce 操作。1GC28資訊網——每日最新資訊28at.com

本文大綱如下,1GC28資訊網——每日最新資訊28at.com

圖片圖片1GC28資訊網——每日最新資訊28at.com

reduce 操作三要素

為了方便大家理解 reduce (規約)操作,先給大家演示一下 reduce 操作的相關代碼示例,1GC28資訊網——每日最新資訊28at.com

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);int result = numbers  .stream()  .reduce(0, (subtotal, element) -> subtotal + element);assertThat(result).isEqualTo(21);

可以看到,我們的 reduce 操作接受了三個參數,返回了一個 int 基本類型。1GC28資訊網——每日最新資訊28at.com

在 Stream API 中,提供了三個 reduct 操作方法,根據參數不同進行區分。1GC28資訊網——每日最新資訊28at.com

圖片圖片1GC28資訊網——每日最新資訊28at.com

對應上方代碼示例,也就是使用了接受兩個參數的 reduce 方法,但其實接受兩個參數的 reduce 方法的代碼邏輯是和接受三個參數的 reduce 方法是一致的。通過上方截圖可以看出。1GC28資訊網——每日最新資訊28at.com

所以這里,我就直接給大家介紹下 reduce 操作的三個參數分別有什么作用即可。1GC28資訊網——每日最新資訊28at.com

identiy 參數

identiy(初始值)是 reduce 操作的初始值,也就是當元素集合為空時的默認結果。對應上方代碼示例,也就是說 reduce 操作的初始值是 0。1GC28資訊網——每日最新資訊28at.com

accumulator 參數

accumulator(累加器)是一個函數,它接受兩個參數,reduce 操作的部分元素和元素集合中的下一個元素。它返回一個新的部分元素。在這個例子中,累加器是一個 lambda 表達式,它將集合中兩個整數相加并返回一個整數:(a, b) -> a + b。1GC28資訊網——每日最新資訊28at.com

combiner 參數

combiner(組合器)是一個函數,它用于在 reduce 操作被并行化或者當累加器的參數類型和實現類型不匹配時,將 reduce 操作的部分結果進行組合。在上面代碼示例中,我們不需要使用組合器,因為上面我們的 reduce 操作不需要并行,而且累加器的參數類型和實現類型都是 Integer。1GC28資訊網——每日最新資訊28at.com

為了方便大家理解 reduce 操作的內部邏輯,我給大家繪制了上面代碼示例的執行示意圖,如下,1GC28資訊網——每日最新資訊28at.com

圖片1GC28資訊網——每日最新資訊28at.com

如何使用 reduce 操作

為了更好地理解初始值,累加器和組合器的功能,讓我們看一些基本的例子。1GC28資訊網——每日最新資訊28at.com

使用 reduce 查詢整數集合的最小值

// 創建一個整數集合List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);// 找出集合中的最小值Integer min = numbers.stream().reduce((integer, integer2) -> {    if (integer < integer2) {        return integer;    } else {        return integer2;    }}).get();// 輸出結果System.out.println(min); // 1

在這個例子中,我們使用了一個參數的 reduce 操作,它接受一個累加器函數。累加器函數會返回集合兩個元素中,較小的元素。1GC28資訊網——每日最新資訊28at.com

最終我們就可以找出集合中最小值 1。1GC28資訊網——每日最新資訊28at.com

使用 reduce 操作拼接字符串列表

我們可以對一個字符串列表使用 reduce 操作,將它們拼接成一個單一的字符串:1GC28資訊網——每日最新資訊28at.com

// 創建一個字符串列表List<String> letters = Arrays.asList ("a", "b", "c", "d", "e");// 使用 reduce 操作拼接字符串列表String result = letters  .stream ()  .reduce ("", (partialString, element) -> partialString + element);// 輸出結果System.out.println (result); // abcde

在這個例子中,我們將初始值設為 "",累加器函數設為 (a, b) -> a + b,它表示將兩個字符串拼接起來。1GC28資訊網——每日最新資訊28at.com

我們可以看到,reduce 操作將累加器函數反復應用到列表中的每個元素上,得到最終的結果 abcde。1GC28資訊網——每日最新資訊28at.com

使用并行流計算整數列表的總和

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5,6);// 使用并行流和 reduce() 方法計算整數列表的總和int result = numbers.parallelStream()        .reduce(0, (a, b) -> a + b, Integer::sum);// 輸出結果System.out.println(result); // 21

在這個例子中,我們使用 parallelStream() 方法將列表轉換為并行流,再使用 reduce() 方法對整數列表進行 reduce 操作,并使用 Integer::sum 作為合并函數 combiner,將并行計算的結果合并。1GC28資訊網——每日最新資訊28at.com

使用并行流的好處能夠充分利用多核 CPU 的優勢,使用多線程加快對集合數據的處理速度。1GC28資訊網——每日最新資訊28at.com

不過并行流也不是任何時候都可以使用的,并行流執行過程中實際按照多線程執行,多線程編程有的問題,并行流都有。1GC28資訊網——每日最新資訊28at.com

比如多線程的線程安全,執行順序等問題,并行流都是有的。這一點需要大家注意。1GC28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-51255-0.html一文搞懂 Java8 reduce操作

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 這個17k star的拖拽庫有點料

下一篇: 如何應對 RocketMQ 消息堆積

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 柳江县| 黑龙江省| 阿合奇县| 永兴县| 扬州市| 淮南市| 裕民县| 平乐县| 阿尔山市| 丰台区| 泸西县| 泰宁县| 濮阳县| 丰镇市| 九龙县| 虎林市| 广南县| 密云县| 杂多县| 卢湾区| 许昌县| 韶山市| 互助| 宾阳县| 韶关市| 会宁县| 鄂托克旗| 孝义市| 玛沁县| 衡水市| 郧西县| 鸡泽县| 陵水| 娱乐| 南丹县| 海原县| 上饶县| 黔南| 炉霍县| 澎湖县| 钦州市|