最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java中Collector接口的組成

 更新時間:2021年06月30日 10:49:04   作者:只要你一直跑  
今天給大家?guī)淼氖顷P(guān)于Java基礎(chǔ)的相關(guān)知識,文章圍繞著Collector接口的組成展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下

一、Collector常常出現(xiàn)的地方

java8引入了stream,Collector是與stream一起出現(xiàn)的,配合stream使用的好幫手,如果用過stream,我們應(yīng)該都有寫過這樣的代碼

例子1:

	lists.stream()....collect(Collectors.toList());

例子2:

	lists.stream().collect(groupingBy(String::length));

這兩個例子中,toList()和groupingBy()返回的都是一個Collector對象,那么問題來了,什么是Collector?

二、什么是Collector

Collector其實是一個泛型接口,通過這個接口可以定義一系列的聚合操作,按照官方文檔的說法,Collector其實是提供mutable reduction operation,即可改變的減少操作。

常見的聚合操作有:

1.用StringBuilder拼接字符串

2.計算元素綜合的數(shù)據(jù),比如sum, min, max, or average
這個reduction在Google翻譯是減少的意思,但是我不太對得上這個意思,覺得形容成聚合操作會更容易理解一點(diǎn)。

關(guān)于聚合操作,我們會在很多語言中遇到,比如mysql里面的group by操作,sum(),min(),max(),Count(),anyValue(),這些叫做aggregate function,即聚合操作

我理解這些操作的是類似的,只不過這些是在數(shù)據(jù)庫里面進(jìn)行的,collector是在java代碼層進(jìn)行的,他們的本質(zhì)都是一樣的,他們都進(jìn)行了多對一的轉(zhuǎn)換,將一系列的數(shù)據(jù)變成一個數(shù)據(jù)或者幾團(tuán)數(shù)據(jù)。

三、Collector的使用

Collector是一個接口,它還有一個靜態(tài)工具類Collectors,Collectors提供了很多常見的聚合操作的實現(xiàn),通常來說我們調(diào)用Collectors里面的方法就夠了,如果想要更多更復(fù)雜的實現(xiàn)也可以自定義一個collector,定義Collector的話,我們需要先了解Collector的組成

3.1 Collector的泛型類型

collector是一個泛型接口,那我們先從泛型的元素開始分析

Collector<T, A, R>

這個接口有三種類型,T代表流中元素的類型,A是中間結(jié)果容器的類型,R是最后返回的類型
比如一個字符串?dāng)?shù)組strings,對它進(jìn)行這個操作

	strings.stream()....collect(Collectors.toList());

toList()方法返回的Collector中,T就是String類型,A是List<String>類型,R是List<String>類型,如果不能理解可以繼續(xù)往下看

3.2 Collector 的組成

collector由四個方法組成和一個特性組成

組成 作用
Supplier 創(chuàng)建一個新的結(jié)果容器
accumulator 將一個新的元素(流中的元素)加入到結(jié)果容器中
combiner 接受兩個中間的結(jié)果容器,將它們合并成一個(并行流的時候)
finisher 將結(jié)果容器轉(zhuǎn)換成另一個類型(可選的)

characteristics 是一個枚舉特性集合,決定某些操作過程的特性,比如是否是并行的,是否需要轉(zhuǎn)換結(jié)果容器,是否是有序的,這些特性用來進(jìn)行簡化操作,提供更好的性能。

一共有三個特性,在定義的時候可以選幾個來組成這個集合,它們是:

  • CONCURRENT :意味著這個同一個容器可以被多個線程調(diào)用accumulator方法進(jìn)行操作
  • UNORDERED:意味著這個聚合操作不會保留元素的出現(xiàn)順序,一般是來說最后的結(jié)果容器是無序的(比如Set)才會使用
  • IDENTITY_FINISH:意味著finisher方法是Function.identity(),可以被省略,如果設(shè)置了的話,需要A類型可以能強(qiáng)制地轉(zhuǎn)換成R類型,否則會拋出異常。

關(guān)于Collector的四個方法,這里用一個流程圖來解釋這個過程

在這里插入圖片描述

3.3 舉例解釋Collector四個方法

下面通過Collectors里面提供的常見方法來詳細(xì)地說明Collector的組成

3.3.1 Example1- toList()

首先來看toList()方法的組成

    public static <T> Collector<T, ?, List<T>> toList() {
        return new CollectorImpl<>((Supplier<List<T>>) ArrayList::new, List::add,
                                   (left, right) -> { left.addAll(right); return left; },
                                   CH_ID);
    }

對于這個方法實現(xiàn)來說

  • supplier是 () -> ArrayList::new,提供的容器類型(A)是ArrayList
  • accumulator是List::add,將元素item加入到arrayList容器中,即

(intermediateCollector, item) -> intermediateCollector.add(item)

  • combiner是將兩個容器arrayList合并

(left, right) -> { left.addAll(right); return left;}

  • finisher是啥也不做,combiner之后的結(jié)果就直接返回來,所以R也是ArrayList的類型
  • characteristic是

Collections.unmodifiableSet(EnumSet.of(Collector.Characteristics.IDENTITY_FINISH));

IDENTITY_FINISH這個特性是說,不執(zhí)行finisher函數(shù),直接返回combiner之后的結(jié)果容器

3.3.2 Example2- joining()

joining有三個方法重載,我們這里先看最直觀的一個,它的實現(xiàn)是

    public static Collector<CharSequence, ?, String> joining() {
        return new CollectorImpl<CharSequence, StringBuilder, String>(
                StringBuilder::new, StringBuilder::append,
                (r1, r2) -> { r1.append(r2); return r1; },
                StringBuilder::toString, CH_NOID);
    }
  • supplier是StringBuilder::new,即:

() -> new StringBuilder();

容器A的類型是StringBuilder

  • accumulator是StringBuilder::append, 即

(intermediate, current)-> intermediare.append(current);

  • combiner是

(r1, r2) -> { r1.append(r2); return r1; }

即對于兩個中間的結(jié)果stringBuilder來說,combiner做的事情就是合并兩個stringBuilder,變成一個stringBuilder

  • finisher是StringBuilder::toString,對于最后的容器StringBuilder,finisher會將它轉(zhuǎn)換成String的類型,因此R的類型是String
  • characteristic是一個emptySet(),不包含任何特性

Collections.emptySet();

到此這篇關(guān)于詳解Java中Collector接口的組成的文章就介紹到這了,更多相關(guān)Collector接口的組成內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java中的stream流中的并行查詢java

    java中的stream流中的并行查詢java

    Stream流是Java 8引入的一種新的數(shù)據(jù)處理方式,它提供了一種高效、簡潔的數(shù)據(jù)處理方式,Stream流可以讓我們以聲明式的方式處理數(shù)據(jù),提高了代碼的可讀性和可維護(hù)性,同時,Stream流支持并行處理,可以充分利用多核CPU的性能,提高程序的運(yùn)行效率
    2024-07-07
  • Java中SSM+Shiro系統(tǒng)登錄驗證碼的實現(xiàn)方法

    Java中SSM+Shiro系統(tǒng)登錄驗證碼的實現(xiàn)方法

    這篇文章主要介紹了 SSM+Shiro系統(tǒng)登錄驗證碼的實現(xiàn)方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2017-02-02
  • Java 程序員容易犯的10個SQL錯誤

    Java 程序員容易犯的10個SQL錯誤

    本文介紹了Java 程序員容易犯的10個SQL錯誤。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-01-01
  • Java自定義比較器實現(xiàn)中文排序

    Java自定義比較器實現(xiàn)中文排序

    這篇文章主要介紹了Java自定義比較器實現(xiàn)中文排序,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • RateLimiter 源碼分析

    RateLimiter 源碼分析

    本文主要對ratelimiter的常用方法以及源碼進(jìn)行了分析解讀,具有一定參考價值,需要的朋友可以了解下。
    2017-09-09
  • Spring和SpringMVC掃描注解類沖突的解決方案

    Spring和SpringMVC掃描注解類沖突的解決方案

    這篇文章主要介紹了Spring和SpringMVC掃描注解類沖突的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Java設(shè)計模式之享元模式

    Java設(shè)計模式之享元模式

    這篇文章主要為大家詳細(xì)介紹了Java設(shè)計模式之享元模式的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • java中單雙斜杠的使用圖文詳解

    java中單雙斜杠的使用圖文詳解

    JAVA中的斜杠有正斜杠與反斜杠之分,正斜杠,一般就叫做斜杠,下面這篇文章主要給大家介紹了關(guān)于java中單雙斜杠使用的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • java實現(xiàn)異步回調(diào)返回給前端的方法示例

    java實現(xiàn)異步回調(diào)返回給前端的方法示例

    在Java中實現(xiàn)異步回調(diào)并將結(jié)果返回給前端,通常是在Web應(yīng)用開發(fā)中處理耗時操作時所采用的技術(shù)手段,以避免阻塞HTTP請求線程并提高用戶體驗,本文就來介紹一下如何實現(xiàn),感興趣的可以了解一下
    2024-03-03
  • Java定義棧結(jié)構(gòu),并實現(xiàn)入棧、出棧操作完整示例

    Java定義棧結(jié)構(gòu),并實現(xiàn)入棧、出棧操作完整示例

    這篇文章主要介紹了Java定義棧結(jié)構(gòu),并實現(xiàn)入棧、出棧操作,結(jié)合完整實例形式分析了java數(shù)據(jù)結(jié)構(gòu)中棧的定義、以及入棧、出棧、棧是否為空判斷、棧大小計算、打印棧元素等相關(guān)操作技巧,需要的朋友可以參考下
    2020-02-02

最新評論

巨鹿县| 麻阳| 滦南县| 德钦县| 镇原县| 金湖县| 金堂县| 化德县| 长垣县| 彭泽县| 曲阜市| 高州市| 伊宁市| 赫章县| 察哈| 建水县| 宁河县| 夏邑县| 阳谷县| 交城县| 长顺县| 西乌珠穆沁旗| 冀州市| 崇州市| 电白县| 岑溪市| 高阳县| 迭部县| 乌鲁木齐县| 信宜市| 宁安市| 卫辉市| 桦川县| 黄冈市| 宁安市| 西林县| 同心县| 阿坝县| 沭阳县| 清河县| 石棉县|