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

資訊專欄INFORMATION COLUMN

Java8: Stream Collector

Drinkey / 852人閱讀

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

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

1 Common Stream Collectors

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

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

顧名思義,進行分組,也可以多級分組.多級分組是根據上一次分組的結果來進行分組.

// 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

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

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

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

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

    // 對結果容器應用最終轉換,是累計過程中最后要調的一個函數,作用類似與Stream的map方法
    Function finisher();

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

現在我們需要實現對一個Person對象集合按年齡來分組,實現代碼如下:

// 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是一個終端操作,接受一個收集器對象

收集器可以高效地復合起來,進行多級分組,分區和歸約

可以實現Collector接口來實現自己的收集器

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/70644.html

相關文章

  • Java8 collector接口的定制實現

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

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

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

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

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

    or0fun 評論0 收藏0
  • Java8實戰》-第六章讀書筆記(用流收集數據-01)

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

    EscapedDog 評論0 收藏0
  • Java 8 數據流教程

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

    XUI 評論0 收藏0

發表評論

0條評論

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