国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java8: Stream Collector

Drinkey / 862人閱讀

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

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

1 Common Stream Collectors

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

1.1 joining

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

// 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ù)上一次分組的結(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ū)是分組的特殊情況,由一個謂詞(返回一個布爾值的函數(shù))作為分類函數(shù).所以返回的Map集合只有兩個key,一個true,一個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方法接受一個Collector子類對象.我們之前調(diào)的toList,groupingBy,partition等等都是Collectors中通過工廠方法創(chuàng)建的流收集器.所以如果我們需要創(chuàng)建自己的流收集器,只需要實現(xiàn)Collector接口即可.先看Collector接口的定義,以及解釋其抽象方法的意思:

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

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

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

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

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

現(xiàn)在我們需要實現(xiàn)對一個Person對象集合按年齡來分組,實現(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是一個終端操作,接受一個收集器對象

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

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

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

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/70644.html

相關(guān)文章

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

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

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

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

    wind5o 評論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 評論0 收藏0
  • Java8實戰(zhàn)》-第六章讀書筆記(用流收集數(shù)據(jù)-01)

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

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

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

    XUI 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<