亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解Java中Collector接口的組成

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

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

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

例子1:

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

例子2:

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

這兩個(gè)例子中,toList()和groupingBy()返回的都是一個(gè)Collector對(duì)象,那么問(wèn)題來(lái)了,什么是Collector?

二、什么是Collector

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

常見(jiàn)的聚合操作有:

1.用StringBuilder拼接字符串

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

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

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

三、Collector的使用

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

3.1 Collector的泛型類(lèi)型

collector是一個(gè)泛型接口,那我們先從泛型的元素開(kāi)始分析

Collector<T, A, R>

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

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

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

3.2 Collector 的組成

collector由四個(gè)方法組成和一個(gè)特性組成

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

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

一共有三個(gè)特性,在定義的時(shí)候可以選幾個(gè)來(lái)組成這個(gè)集合,它們是:

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

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

在這里插入圖片描述

3.3 舉例解釋Collector四個(gè)方法

下面通過(guò)Collectors里面提供的常見(jiàn)方法來(lái)詳細(xì)地說(shuō)明Collector的組成

3.3.1 Example1- toList()

首先來(lái)看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);
    }

對(duì)于這個(gè)方法實(shí)現(xiàn)來(lái)說(shuō)

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

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

  • combiner是將兩個(gè)容器arrayList合并

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

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

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

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

3.3.2 Example2- joining()

joining有三個(gè)方法重載,我們這里先看最直觀的一個(gè),它的實(shí)現(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的類(lèi)型是StringBuilder

  • accumulator是StringBuilder::append, 即

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

  • combiner是

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

即對(duì)于兩個(gè)中間的結(jié)果stringBuilder來(lái)說(shuō),combiner做的事情就是合并兩個(gè)stringBuilder,變成一個(gè)stringBuilder

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

Collections.emptySet();

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

相關(guān)文章

  • Java實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲?附完整源碼

    Java實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲?附完整源碼

    這篇文章主要介紹了Java實(shí)現(xiàn)飛機(jī)大戰(zhàn)游戲,本文給大家分享完整源代碼和效果圖展示,對(duì)java飛機(jī)大戰(zhàn)游戲?qū)崿F(xiàn)代碼感興趣的朋友一起看看吧
    2022-05-05
  • Java集合ConcurrentHashMap詳解

    Java集合ConcurrentHashMap詳解

    ConcurrentHashMap?是?J.U.C?包里面提供的一個(gè)線(xiàn)程安全并且高效的?HashMap,所以ConcurrentHashMap?在并發(fā)編程的場(chǎng)景中使用的頻率比較高
    2023-01-01
  • JAVA JVM面試題總結(jié)

    JAVA JVM面試題總結(jié)

    JVM 可以屏蔽與具體操作系統(tǒng)平臺(tái)相關(guān)的信息,使 Java 程序只需生成在 Java 虛擬機(jī)上運(yùn)行的目標(biāo)代碼,就可以在不同的平臺(tái)上運(yùn)行。這篇文章主要介紹了JAVA JVM面試題總結(jié),大家可以參考一下
    2021-08-08
  • java api返回值的標(biāo)準(zhǔn)化詳解

    java api返回值的標(biāo)準(zhǔn)化詳解

    這篇文章主要介紹了java api返回值的標(biāo)準(zhǔn)化詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Java中的Unsafe工具類(lèi)使用詳解

    Java中的Unsafe工具類(lèi)使用詳解

    這篇文章主要介紹了Java中的Unsafe工具類(lèi)使用詳解,Unsafe是jdk提供的一個(gè)直接訪問(wèn)操作系統(tǒng)資源的工具類(lèi)(底層c++實(shí)現(xiàn)),它可以直接分配內(nèi)存,內(nèi)存復(fù)制,copy,提供cpu級(jí)別的CAS樂(lè)觀鎖等操作,需要的朋友可以參考下
    2023-12-12
  • SpringBoot默認(rèn)使用HikariDataSource數(shù)據(jù)源方式

    SpringBoot默認(rèn)使用HikariDataSource數(shù)據(jù)源方式

    這篇文章主要介紹了SpringBoot默認(rèn)使用HikariDataSource數(shù)據(jù)源方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • 如何使用Springfox?Swagger實(shí)現(xiàn)API自動(dòng)生成單元測(cè)試

    如何使用Springfox?Swagger實(shí)現(xiàn)API自動(dòng)生成單元測(cè)試

    Springfox是一個(gè)使用Java語(yǔ)言開(kāi)發(fā)開(kāi)源的API Doc的框架,它的前身是swagger-springmvc,可以將我們的Controller中的方法以文檔的形式展現(xiàn),這篇文章主要介紹了如何使用Springfox?Swagger實(shí)現(xiàn)API自動(dòng)生成單元測(cè)試,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • Java定義棧結(jié)構(gòu),并實(shí)現(xiàn)入棧、出棧操作完整示例

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

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

    maven項(xiàng)目如何依賴(lài)自定jar包

    這篇文章主要介紹了maven項(xiàng)目如何依賴(lài)自定jar包,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • 簡(jiǎn)單了解redis常見(jiàn)客戶(hù)端及Sharding機(jī)制原理

    簡(jiǎn)單了解redis常見(jiàn)客戶(hù)端及Sharding機(jī)制原理

    這篇文章主要介紹了簡(jiǎn)單了解redis常見(jiàn)客戶(hù)端及Sharding機(jī)制原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09

最新評(píng)論