JAVA 8 收集器 使用

JAVA 8 收集器(Collectors) 使用

收集器功能:1.將流元素歸約和匯總 2.元素分組 3.元素分區(qū)
都是 import static java.util.stream.Collectors.*; 前提下

一载庭、歸約和匯總

1. 查找最大最小值
maxBy(Comparator)
minBy(Comparator)
2. 匯總
求和:
summingInt(XX::getX)
summingLong(XX::getX)
summingDouble(XX::getX)
求平均值:
averagingInt(XX::getX)
averagingDouble(XX::getX)
averagingLong(XX::getX)
綜合方法靴患,和,平均猫胁,最大最小全求出來(lái):
summarizingInt(XX:getX)
summarizingDouble(XX:getX)
summarizingLong(XX:getX)
3. 連接字符串
joining()  --內(nèi)部使用StringBuffer拼接
joining(", ")  --可以添加參數(shù)名眉,用什么隔開(kāi)
4. 廣義的歸約匯總
reducing(M,N,W) 需要3個(gè)參數(shù) 

M   ->  初始值
N   ->  XX::getX
W   ->  一個(gè)lamda轉(zhuǎn)換函數(shù)

reducing(W) 可以一個(gè)參數(shù)

W   ->  一個(gè)Lambda轉(zhuǎn)換函數(shù)

二萍歉、分組

Collectors.groupingBy()
1.簡(jiǎn)單分組
Collectors.groupingBy(W)  W為一個(gè)Lambda
public enum Level { LOW, NORMAL, HIGH };
Map<Integer, List<Transaction>> maps = trans.parallelStream().collect(groupingBy(Transaction::getValue));

//返回的是Key
Map<Level, List<Transaction>> maps2 = trans.parallelStream().collect(groupingBy(t -> {
    if (t.getValue() <= 500)
        return Level.LOW;
    else if (t.getValue() <= 1000)
        return Level.NORMAL;
    else
        return Level.HIGH;
}));
2.多級(jí)分組

多級(jí)就是類似按照這一級(jí)規(guī)則分完組撩轰,繼續(xù)按照下個(gè)規(guī)則繼續(xù)分組,將內(nèi)存?zhèn)鬟f給外層

即為groupingBy套用groupingBy
Collectors.groupingBy(W, groupingBy(M))  W為一個(gè)分類函數(shù) M可以為任何類型
Map<Integer, Map<Level, List<Transaction>>> maps3 = trans.parallelStream()
    .collect(groupingBy(Transaction::getYear, groupingBy(t -> {
        if (t.getValue() <= 500)
            return Level.LOW;
        else if (t.getValue() <= 1000)
            return Level.NORMAL;
        else
            return Level.HIGH;
    })));
3.按子組收集數(shù)據(jù)
傳遞給groupingBy的第二個(gè)收集器可以是==任何類型==
普通的單函數(shù)groupingBy(f) 實(shí)際上為 groupingBy(f, toList())
Map<Integer, Optional<T>> maps4 = trans.stream().collect(groupingBy(T::getYear,
    maxBy(Comparator.comparingInt(T::getValue))));
3.1 把收集器結(jié)果轉(zhuǎn)換為另一種類型
Collectors.collectingAndThen(W,M) 返回一個(gè)收集器
W:要轉(zhuǎn)換的收集器 M:轉(zhuǎn)換函數(shù)
Map<Integer, Transaction> maps5 = trans.stream().collect(groupingBy(Transaction::getYear,
    collectingAndThen(maxBy(comparing(Transaction::getValue)), Optional::get)));
3.2 于groupingBy聯(lián)合使用的其他收集器
Collectors.mapping(W,M) 返回一個(gè)收集器
W:轉(zhuǎn)換函數(shù) M:收集函數(shù)
這里是先將值映射為L(zhǎng)evel啃沪,將生成的Level流傳給toSet粘拾,然后返回:

Map<Integer, Set<Level>> maps7 = trans.stream()
    .collect(groupingBy(Transaction::getYear, Collectors.mapping(t -> {
        if (t.getValue() <= 500)
            return Level.LOW;
        else if (t.getValue() <= 1000)
            return Level.NORMAL;
        else
            return Level.HIGH;
    }, toSet())));
    
Map<Integer, Set<Level>> maps7 = trans.stream()
    .collect(groupingBy(Transaction::getYear, Collectors.mapping(t -> {
        if (t.getValue() <= 500)
            return Level.LOW;
        else if (t.getValue() <= 1000)
            return Level.NORMAL;
        else
            return Level.HIGH;
    }, Collectors.toCollection(HashSet::new))));
    
Collectors.toCollection(HashSet::new) 可以控制其生成的流的類型

三、分區(qū)

1. 分區(qū)
Collectors.partitioningBy(W)  W必須為返回boolean值的函數(shù)
Collectors.partitioningBy(W,M)  W必須為返回boolean值的函數(shù) M為收集器
直接按照某boolean值分區(qū) true|false
Map<Boolean, List<Transaction>> map1 = trans.stream().collect(Collectors.partitioningBy(Transaction::getIsOk));

可以添加收集器參數(shù)
Map<Boolean, Map<Integer, List<Transaction>>> map2 = trans.stream()
    .collect(Collectors.partitioningBy(Transaction::getIsOk, groupingBy(Transaction::getYear)));

可以使用collectingAndThen來(lái)完成連續(xù)收集功能
Map<Boolean, Transaction> map3 = trans.stream().collect(Collectors.partitioningBy(Transaction::getIsOk,
    collectingAndThen(maxBy(Comparator.comparing(Transaction::getValue)), Optional::get)));
2.按照質(zhì)數(shù)非質(zhì)數(shù)分區(qū)
private boolean isPrime(int num) {
    int num2 = (int) Math.sqrt((double) num);
    return IntStream.rangeClosed(2, num2).noneMatch(t -> num % t == 0);
}

private  Map<Boolean, List<Integer>> getNum(int n) {
    return IntStream.rangeClosed(2, n).boxed().collect(Collectors.partitioningBy(t -> isPrime(t)));
}

Map<Boolean, List<Integer>> map4 = getNum(N);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末创千,一起剝皮案震驚了整個(gè)濱河市缰雇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌追驴,老刑警劉巖械哟,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異氯檐,居然都是意外死亡戒良,警方通過(guò)查閱死者的電腦和手機(jī)体捏,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門冠摄,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人几缭,你說(shuō)我怎么就攤上這事河泳。” “怎么了年栓?”我有些...
    開(kāi)封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵拆挥,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我某抓,道長(zhǎng)纸兔,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任否副,我火速辦了婚禮汉矿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘备禀。我一直安慰自己洲拇,他們只是感情好奈揍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著赋续,像睡著了一般男翰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纽乱,一...
    開(kāi)封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天蛾绎,我揣著相機(jī)與錄音,去河邊找鬼鸦列。 笑死秘通,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的敛熬。 我是一名探鬼主播肺稀,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼应民!你這毒婦竟也來(lái)了话原?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤诲锹,失蹤者是張志新(化名)和其女友劉穎繁仁,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體归园,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黄虱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了庸诱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捻浦。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖桥爽,靈堂內(nèi)的尸體忽然破棺而出朱灿,到底是詐尸還是另有隱情,我是刑警寧澤钠四,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布盗扒,位于F島的核電站,受9級(jí)特大地震影響缀去,放射性物質(zhì)發(fā)生泄漏侣灶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一缕碎、第九天 我趴在偏房一處隱蔽的房頂上張望褥影。 院中可真熱鬧,春花似錦阎曹、人聲如沸伪阶。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)栅贴。三九已至斟湃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間檐薯,已是汗流浹背凝赛。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坛缕,地道東北人墓猎。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像赚楚,于是被迫代替她去往敵國(guó)和親毙沾。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Java8 in action 沒(méi)有共享的可變數(shù)據(jù)宠页,將方法和函數(shù)即代碼傳遞給其他方法的能力就是我們平常所說(shuō)的函數(shù)式...
    鐵牛很鐵閱讀 1,231評(píng)論 1 2
  • 收集器簡(jiǎn)介 Collector 函數(shù)式編程相對(duì)于指令式編程的一個(gè)主要優(yōu)勢(shì):你只需要指出希望的結(jié)果“做什么”左胞,而不用...
    潯它芉咟渡閱讀 820評(píng)論 0 4
  • 之前寫了JDK8集合流的入門以及篩選,也就是集合流使用的打開(kāi)和中間操作举户。這次帶來(lái)的是不同的收集數(shù)據(jù)的方式烤宙。 本節(jié)代...
    Weidan閱讀 1,257評(píng)論 0 4
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)俭嘁,斷路器躺枕,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • Int Double Long 設(shè)置特定的stream類型, 提高性能供填,增加特定的函數(shù) 無(wú)存儲(chǔ)拐云。stream不是一...
    patrick002閱讀 1,273評(píng)論 0 0