成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Java8: Stream Collector

Drinkey / 859人閱讀

摘要:寫在前面本文要介紹的是流收集器在前面的文章中我們都知道如果要收集流數(shù)據(jù)調(diào)用方法即可本文主要是介紹常用的流收集器和自定義流收集器說一說常用的流收集器這里只是簡(jiǎn)單介紹用法具體是如何實(shí)現(xiàn)的我會(huì)在下面進(jìn)行解釋是用來連接字符串的流收集器有三個(gè)重載方法

寫在前面: 本文要介紹的是流收集器.在前面的文章中,我們都知道如果要收集流數(shù)據(jù),調(diào)用collect方法即可.本文主要是介紹常用的流收集器和自定義流收集器.

1 Common Stream Collectors

說一說常用的流收集器,這里只是簡(jiǎn)單介紹用法,具體是如何實(shí)現(xiàn)的我會(huì)在下面進(jìn)行解釋.

1.1 joining

joining是用來連接字符串的流收集器.有三個(gè)重載方法.

// method definition
public static Collector joining();
public static Collector joining(CharSequence delimiter);
public static Collector joining(CharSequence delimiter,
                                                         CharSequence prefix,
                                                         CharSequence suffix);
// examples
String res1 = Stream.of("1", "2", "3", "4").collect(joining());             //1234
String res2 = Stream.of("1", "2", "3", "4").collect(joining(","));          //1,2,3,4
String res3 = Stream.of("1", "2", "3", "4").collect(joining(",", "{", "}"));//{1,2,3,4}
1.2 groupingBy

顧名思義,進(jìn)行分組,也可以多級(jí)分組.多級(jí)分組是根據(jù)上一次分組的結(jié)果來進(jìn)行分組.

// entity
public class Person {
    private String name;
    private int age;
    private double height;
}
// examples
// e1: group by age
Map> groupByAge = list.stream()
.collect(groupingBy(Person::getAge));
// e2: group by age and name
Map>> groupByAgeAndName = list.stream()
.collect(groupingBy(Person::getAge, groupingBy(Person::getName)));
// e3: group by age , name and height
Map>>> groupByAgeAndNameAndHeight = list.stream()
.collect(groupingBy(Person::getAge, groupingBy(Person::getName, groupingBy(Person::getHeight))));
1.3 partition

分區(qū)是分組的特殊情況,由一個(gè)謂詞(返回一個(gè)布爾值的函數(shù))作為分類函數(shù).所以返回的Map集合只有兩個(gè)key,一個(gè)true,一個(gè)false.

// is age greater than 20
Map> isGT20 = list.stream().collect(partitioningBy(e -> e.getAge() > 20));
// is age greater than 20, and group by age
Map>> isGT20AndGroupByAge = list.stream().collect(partitioningBy(e -> e.getAge() > 20, groupingBy(Person::getAge)));
2 Custom Stream Collector

首先咱們看collect方法的定義:

 R collect(Collector collector);

collect方法接受一個(gè)Collector子類對(duì)象.我們之前調(diào)的toList,groupingBy,partition等等都是Collectors中通過工廠方法創(chuàng)建的流收集器.所以如果我們需要?jiǎng)?chuàng)建自己的流收集器,只需要實(shí)現(xiàn)Collector接口即可.先看Collector接口的定義,以及解釋其抽象方法的意思:

public interface Collector {
    // 建立新的結(jié)果容器.也就是最終流元素進(jìn)行處理之后的結(jié)果是存放在這個(gè)容器中的
    Supplier supplier();

    // 將元素添加到結(jié)果容器中
    BiConsumer accumulator();

    // 合并兩個(gè)結(jié)果容器,使用parallelStream的時(shí)候會(huì)調(diào)用這個(gè)方法
    BinaryOperator combiner();

    // 對(duì)結(jié)果容器應(yīng)用最終轉(zhuǎn)換,是累計(jì)過程中最后要調(diào)的一個(gè)函數(shù),作用類似與Stream的map方法
    Function finisher();

    // 返回一個(gè)不可變的Characteristic集合,它定義了收集器的行為
    // 尤其是關(guān)于流是否可以并行規(guī)約,以及使用哪些優(yōu)化的提示
    Set characteristics();
}
2.1 Example

現(xiàn)在我們需要實(shí)現(xiàn)對(duì)一個(gè)Person對(duì)象集合按年齡來分組,實(shí)現(xiàn)代碼如下:

// define a custom collector
public class MyGrouping implements Collector>, Map>> {
    @Override
    public Supplier>> supplier() {
        return HashMap::new;
    }

    @Override
    public BiConsumer>, Person> accumulator() {
        return (map, p) -> {
            ArrayList list;
            if ((list = map.get(p.getAge())) != null) {
                list.add(p);
            } else {
                list = new ArrayList<>();
                list.add(p);
                map.put(p.getAge(), list);
            }
        };
    }

    @Override
    public BinaryOperator>> combiner() {
        return (m1, m2) -> Stream.of(m1, m2)
                .map(Map::entrySet)
                .flatMap(Collection::stream)
                .collect(toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> {
                    e1.addAll(e2);
                    return e1;
                }));
    }

    @Override
    public Function>, Map>> finisher() {
        return Function.identity();
    }

    @Override
    public Set characteristics() {
        return Collections.unmodifiableSet(EnumSet.of(IDENTITY_FINISH, CONCURRENT));
    }
}

// how to use
Map> customGroupByAge = list.stream().collect(new MyGrouping());
3 Summary

collect是一個(gè)終端操作,接受一個(gè)收集器對(duì)象

收集器可以高效地復(fù)合起來,進(jìn)行多級(jí)分組,分區(qū)和歸約

可以實(shí)現(xiàn)Collector接口來實(shí)現(xiàn)自己的收集器

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70644.html

相關(guān)文章

  • Java8 collector接口的定制實(shí)現(xiàn)

    摘要:寫這個(gè)文章其實(shí)主要是因?yàn)閯傆袀€(gè)童鞋問了個(gè)問題正寫的帶勁安利的實(shí)現(xiàn)方式,結(jié)果還沒寫完無意發(fā)現(xiàn)問題被關(guān)閉了哎都寫了一半了又不想放棄,就干脆寫成文章問題主要就是把集合里的數(shù)據(jù)按照一定大小順序平均分成若干組的問題,看起來挺簡(jiǎn)單的,不過我開始看到就想 寫這個(gè)文章其實(shí)主要是因?yàn)閯傆袀€(gè)童鞋問了個(gè)問題https://segmentfault.com/q/10...正寫的帶勁安利Java8的實(shí)現(xiàn)方式,結(jié)...

    zhangwang 評(píng)論0 收藏0
  • Stream流與Lambda表達(dá)式(四) 自定義收集器

    摘要:一自定義收集器陳楊將集合轉(zhuǎn)換為集合存放相同元素二自定義收集器陳楊將學(xué)生對(duì)象按照存放從中間容器數(shù)據(jù)類型轉(zhuǎn)換為結(jié)果類型數(shù)據(jù)類型一致若不一致拋出類型轉(zhuǎn)換異常對(duì)中間容器數(shù)據(jù)結(jié)果類型進(jìn)行強(qiáng)制類型轉(zhuǎn)換多個(gè)線程同時(shí)操作同一個(gè)容器并行多線 一、自定義SetCustomCollector收集器 package com.java.design.Stream.CustomCollector; impor...

    wind5o 評(píng)論0 收藏0
  • Stream流與Lambda表達(dá)式(二) Stream收集器 Collector接口

    摘要:一收集器接口陳楊收集器接口匯聚操作的元素類型即流中元素類型匯聚操作的可變累積類型匯聚操作的結(jié)果類型接口一種可變匯聚操作將輸入元素累積到可變結(jié)果容器中在處理完所有輸入元素后可以選擇將累積的結(jié)果轉(zhuǎn)換為最終表示可選操作歸約操作 一、Stream收集器 Collector接口 package com.java.design.java8.Stream; import com.java.desi...

    or0fun 評(píng)論0 收藏0
  • Java8實(shí)戰(zhàn)》-第六章讀書筆記(用流收集數(shù)據(jù)-01)

    摘要:收集器用作高級(jí)歸約剛剛的結(jié)論又引出了優(yōu)秀的函數(shù)式設(shè)計(jì)的另一個(gè)好處更易復(fù)合和重用。更具體地說,對(duì)流調(diào)用方法將對(duì)流中的元素觸發(fā)一個(gè)歸約操作由來參數(shù)化。另一個(gè)常見的返回單個(gè)值的歸約操作是對(duì)流中對(duì)象的一個(gè)數(shù)值字段求和。 用流收集數(shù)據(jù) 我們?cè)谇耙徽轮袑W(xué)到,流可以用類似于數(shù)據(jù)庫(kù)的操作幫助你處理集合。你可以把Java 8的流看作花哨又懶惰的數(shù)據(jù)集迭代器。它們支持兩種類型的操作:中間操作(如 filt...

    EscapedDog 評(píng)論0 收藏0
  • Java 8 數(shù)據(jù)流教程

    摘要:數(shù)據(jù)流教程原文譯者飛龍協(xié)議這個(gè)示例驅(qū)動(dòng)的教程是數(shù)據(jù)流的深入總結(jié)。但是的數(shù)據(jù)流是完全不同的東西。數(shù)據(jù)流是單體,并且在函數(shù)式編程中起到重要作用。列表上的所有流式操作請(qǐng)見數(shù)據(jù)流的?;镜臄?shù)據(jù)流使用特殊的表達(dá)式,例如,而不是,而不是。 Java 8 數(shù)據(jù)流教程 原文:Java 8 Stream Tutorial 譯者:飛龍 協(xié)議:CC BY-NC-SA 4.0 這個(gè)示例驅(qū)動(dòng)的教程是J...

    XUI 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<