欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文帶你掌握java8中的reduce操作

 更新時(shí)間:2023年12月22日 08:14:24   作者:waynaqua  
reduce?操作是一種通用的歸約操作,它可以實(shí)現(xiàn)從?Stream?中生成一個(gè)值,其生成的值不是隨意的,而是根據(jù)指定的計(jì)算模型,下面我們就來深入了解下java8中的reduce操作吧

什么是 reduce

Java8 中有兩大最為重要的改變,其一是 Lambda 表達(dá)式,另一個(gè)就是 Stream API 了。

Stream 是 Java8 中處理集合的關(guān)鍵抽象概念,它將數(shù)據(jù)源流化后,可以執(zhí)行非常復(fù)雜的查找、過濾和映射數(shù)據(jù)、排序、切片、聚合統(tǒng)計(jì)等操作。操作之后會(huì)產(chǎn)生一個(gè)新的流,而數(shù)據(jù)源則不會(huì)發(fā)生改變。

在使用 Stream 操作的過程中,往往有三個(gè)步驟,

1. 創(chuàng)建 Stream

從一個(gè)數(shù)據(jù)源(集合,數(shù)組)中,新建一個(gè) Stream 流。

2. 中間操作

一個(gè)中間操作鏈,對(duì) Stream 流的數(shù)據(jù)進(jìn)行處理。比如查找、過濾、映射轉(zhuǎn)換等。

3. 終止操作

一個(gè)終止操作,執(zhí)行中間操作鏈,并產(chǎn)生結(jié)果。常用的終止操作有 forearch、collect、match、count、min、max、reduce 等。

其中本文主要講解的 reduct 操作就屬于是 Stream 流操作中的終止操作。

reduce 操作是一種通用的歸約操作,它可以實(shí)現(xiàn)從 Stream 中生成一個(gè)值,其生成的值不是隨意的,而是根據(jù)指定的計(jì)算模型。

比如終止操作中提到 count、min 和 max 方法,因?yàn)槌S枚患{入標(biāo)準(zhǔn)庫中。事實(shí)上這些方法都是一種 reduce 操作。

本文大綱如下,

reduce 操作三要素

為了方便大家理解 reduce (規(guī)約)操作,先給大家演示一下 reduce 操作的相關(guān)代碼示例,

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 操作接受了三個(gè)參數(shù),返回了一個(gè) int 基本類型。

在 Stream API 中,提供了三個(gè) reduct 操作方法,根據(jù)參數(shù)不同進(jìn)行區(qū)分。

對(duì)應(yīng)上方代碼示例,也就是使用了接受兩個(gè)參數(shù)的 reduce 方法,但其實(shí)接受兩個(gè)參數(shù)的 reduce 方法的代碼邏輯是和接受三個(gè)參數(shù)的 reduce 方法是一致的。通過上方截圖可以看出。

所以這里,我就直接給大家介紹下 reduce 操作的三個(gè)參數(shù)分別有什么作用即可。

identiy 參數(shù)

identiy(初始值)是 reduce 操作的初始值,也就是當(dāng)元素集合為空時(shí)的默認(rèn)結(jié)果。對(duì)應(yīng)上方代碼示例,也就是說 reduce 操作的初始值是 0。

accumulator 參數(shù)

accumulator(累加器)是一個(gè)函數(shù),它接受兩個(gè)參數(shù),reduce 操作的部分元素和元素集合中的下一個(gè)元素。它返回一個(gè)新的部分元素。在這個(gè)例子中,累加器是一個(gè) lambda 表達(dá)式,它將集合中兩個(gè)整數(shù)相加并返回一個(gè)整數(shù):(a, b) -> a + b。

combiner 參數(shù)

combiner(組合器)是一個(gè)函數(shù),它用于在 reduce 操作被并行化或者當(dāng)累加器的參數(shù)類型和實(shí)現(xiàn)類型不匹配時(shí),將 reduce 操作的部分結(jié)果進(jìn)行組合。在上面代碼示例中,我們不需要使用組合器,因?yàn)樯厦嫖覀兊?reduce 操作不需要并行,而且累加器的參數(shù)類型和實(shí)現(xiàn)類型都是 Integer。

為了方便大家理解 reduce 操作的內(nèi)部邏輯,我給大家繪制了上面代碼示例的執(zhí)行示意圖,如下,

如何使用 reduce 操作

為了更好地理解初始值,累加器和組合器的功能,讓我們看一些基本的例子。

使用 reduce 查詢整數(shù)集合的最小值

// 創(chuàng)建一個(gè)整數(shù)集合
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();

// 輸出結(jié)果
System.out.println(min); // 1

在這個(gè)例子中,我們使用了一個(gè)參數(shù)的 reduce 操作,它接受一個(gè)累加器函數(shù)。累加器函數(shù)會(huì)返回集合兩個(gè)元素中,較小的元素。

最終我們就可以找出集合中最小值 1。

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

我們可以對(duì)一個(gè)字符串列表使用 reduce 操作,將它們拼接成一個(gè)單一的字符串:

// 創(chuàng)建一個(gè)字符串列表
List<String> letters = Arrays.asList ("a", "b", "c", "d", "e");

// 使用 reduce 操作拼接字符串列表
String result = letters
  .stream ()
  .reduce ("", (partialString, element) -> partialString + element);

// 輸出結(jié)果
System.out.println (result); // abcde

在這個(gè)例子中,我們將初始值設(shè)為 "",累加器函數(shù)設(shè)為 (a, b) -> a + b,它表示將兩個(gè)字符串拼接起來。

我們可以看到,reduce 操作將累加器函數(shù)反復(fù)應(yīng)用到列表中的每個(gè)元素上,得到最終的結(jié)果 abcde。

使用并行流計(jì)算整數(shù)列表的總和

List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5,6);

// 使用并行流和 reduce() 方法計(jì)算整數(shù)列表的總和
int result = numbers.parallelStream()
        .reduce(0, (a, b) -> a + b, Integer::sum);

// 輸出結(jié)果
System.out.println(result); // 21

在這個(gè)例子中,我們使用 parallelStream() 方法將列表轉(zhuǎn)換為并行流,再使用 reduce() 方法對(duì)整數(shù)列表進(jìn)行 reduce 操作,并使用 Integer::sum 作為合并函數(shù) combiner,將并行計(jì)算的結(jié)果合并。

使用并行流的好處能夠充分利用多核 CPU 的優(yōu)勢,使用多線程加快對(duì)集合數(shù)據(jù)的處理速度。

不過并行流也不是任何時(shí)候都可以使用的,并行流執(zhí)行過程中實(shí)際按照多線程執(zhí)行,多線程編程有的問題,并行流都有。

比如多線程的線程安全,執(zhí)行順序等問題,并行流都是有的。這一點(diǎn)需要大家注意。

到此這篇關(guān)于一文帶你掌握java8中的reduce操作的文章就介紹到這了,更多相關(guān)java8 reduce內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java ArrayBlockingQueue阻塞隊(duì)列的實(shí)現(xiàn)示例

    java ArrayBlockingQueue阻塞隊(duì)列的實(shí)現(xiàn)示例

    ArrayBlockingQueue是一個(gè)基于數(shù)組實(shí)現(xiàn)的阻塞隊(duì)列,本文就來介紹一下java ArrayBlockingQueue阻塞隊(duì)列的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • JAVA進(jìn)階篇之詳細(xì)了解File文件的常用API

    JAVA進(jìn)階篇之詳細(xì)了解File文件的常用API

    這篇文章主要給大家介紹了關(guān)于JAVA進(jìn)階篇之詳細(xì)了解File文件的常用API的相關(guān)資料,File用于表示文件系統(tǒng)中的一個(gè)文件或目錄,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11
  • SpringBoot請求參數(shù)相關(guān)注解說明小結(jié)

    SpringBoot請求參數(shù)相關(guān)注解說明小結(jié)

    這篇文章主要介紹了SpringBoot請求參數(shù)相關(guān)注解說明,主要包括@PathVariable,@RequestHeader、@CookieValue、@RequestBody和@RequestParam,本文結(jié)合實(shí)例代碼給大家講解的非常詳細(xì),需要的朋友可以參考下
    2022-05-05
  • Java多線程 ThreadLocal原理解析

    Java多線程 ThreadLocal原理解析

    這篇文章主要介紹了Java多線程 ThreadLocal原理,ThreadLoal 變量,線程局部變量,同一個(gè) ThreadLocal 所包含的對(duì)象,在不同的 Thread 中有不同的副本,下面文章也是圍繞Java多線程 ThreadLocal展開內(nèi)容,需要的朋友可以參考一下
    2021-10-10
  • Linux下JDK安裝教程

    Linux下JDK安裝教程

    這篇文章主要為大家詳細(xì)介紹了Linux下JDK安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java中Properties類的操作實(shí)例詳解

    Java中Properties類的操作實(shí)例詳解

    這篇文章主要介紹了Java中Properties類的操作實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-04-04
  • 教你用JAVA寫文本編輯器(一)

    教你用JAVA寫文本編輯器(一)

    對(duì)于學(xué)習(xí)java編程的小伙伴們,常常需要編寫一個(gè)類似文本編輯器的東西,下面這篇文章主要給大家介紹了關(guān)于如何用JAVA寫文本編輯器的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • Java全面解析IO流相關(guān)知識(shí)

    Java全面解析IO流相關(guān)知識(shí)

    這篇文章主要介紹了IO流相關(guān)知識(shí),包括File,字節(jié)流,字符流,特殊操作流(標(biāo)準(zhǔn)輸入流,標(biāo)準(zhǔn)輸出流,對(duì)象序列化與反序列化,properties與IO流結(jié)合)相關(guān)知識(shí)的總結(jié)
    2021-08-08
  • 一次 Java 內(nèi)存泄漏的排查解決過程詳解

    一次 Java 內(nèi)存泄漏的排查解決過程詳解

    這篇文章主要介紹了一次 Java 內(nèi)存泄漏的排查過程詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-07-07
  • 關(guān)于JVM默認(rèn)堆內(nèi)存大小問題

    關(guān)于JVM默認(rèn)堆內(nèi)存大小問題

    這篇文章主要介紹了關(guān)于JVM默認(rèn)堆內(nèi)存大小問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評(píng)論