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)
綜合方法,和,平均,最大最小全求出來:
summarizingInt(XX:getX)
summarizingDouble(XX:getX)
summarizingLong(XX:getX)
3. 連接字符串
joining()  --內(nèi)部使用StringBuffer拼接
joining(", ")  --可以添加參數(shù),用什么隔開
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.簡單分組
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.多級分組

多級就是類似按照這一級規(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ù)
這里是先將值映射為Level,將生成的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來完成連續(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)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容