最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java?流處理之收集器詳解

 更新時間:2022年09月14日 15:00:03   作者:淵深海闊  
這篇文章主要介紹了Java?流處理之收集器,本文以記錄?Record?為例,結合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

Java 流(Stream)處理操作完成之后,我們可以收集這個流中的元素,使之匯聚成一個最終結果。這個結果可以是一個對象,也可以是一個集合,甚至可以是一個基本類型數據。

以記錄 Record 為例:

@Data
@NoArgsConstructor
@AllArgsConstructor
public static class Record {
    private String col1;
    private String col2;
    private int col3;
}

記錄 Record 包含三個屬性:列1(col1)、列2(col2)和 列3(col3)。

創(chuàng)建四個記錄實例:

Record r1 = new Record("a", "1", 1);
Record r2 = new Record("a", "2", 2);
Record r3 = new Record("b", "3", 3);
Record r4 = new Record("c", "4", 4);

添加到列表:

List<Record> records = new ArrayList<>();
records.add(r1);
records.add(r2);
records.add(r3);
records.add(r4);

收集所有記錄的 列1 值,以列表形式存儲結果

List<String> col1List = records.stream()
        .map(Record::getCol1)
        .collect(Collectors.toList());
log.info("col1List: {}", Json.toJson(col1List));

輸出結果:

col1List: ["a","a","b","c"]

收集所有記錄的 列1 值,且去重,以集合形式存儲

Set<String> col1Set = records.stream()
        .map(Record::getCol1)
        .collect(Collectors.toSet());
log.info("col1Set: {}", Json.toJson(col1Set));

輸出結果:

col1Set: ["a","b","c"]

收集記錄的 列2 值和 列3 值的對應關系,以字典形式存儲

Map<String, Integer> col2Map = records.stream()
        .collect(Collectors.toMap(Record::getCol2, Record::getCol3));
log.info("col2Map: {}", Json.toJson(col2Map));

輸出結果:

col2Map: {"1":1,"2":2,"3":3,"4":4}

記錄的 列2 不能有重復值,否則會拋出 Duplicate key 異常。

收集所有記錄中 列3 值最大的記錄

Record max = records.stream()
        .collect(Collectors.maxBy(Comparator.comparing(Record::getCol3)))
        .orElse(null);
log.info("max: {}", Json.toJson(max));

輸出結果:

max: {"col1":"c","col2":"4","col3":4}

收集所有記錄中 列3 值的總和

int sum = records.stream()
        .collect(Collectors.summingInt(Record::getCol3));
log.info("sum: {}", sum);

輸出結果:

sum: 10

流的收集需要通過 Stream.collect() 方法完成,方法的參數是一個 Collector(收集器) ;收集結果時,需要根據收集結果的目標類型,傳遞特定的收集器實例,如上:

  • Collectors.toList()

  • Collectors.toSet()

  • Collectors.toMap()

  • Collectors.maxBy()

  • Collectors.summingInt()

Collectors(java.util.stream.Collectors) 是一個工具類,內置若干收集器,我們可以通過調用不同的方法快速獲取相應的收集器實例。

收集器(java.util.stream.Collector)本質是一個 接口 ,包含以下五個方法:

  • Supplier supplier()

  • BiConsumer<A, T> accumulator()

  • BinaryOperator combiner()

  • Function<A, R> finisher()

  • Set characteristics()

以 Collectors.toList() 為例演示收集器的工作過程。

創(chuàng)建一個中間結果容器

supplier() 方法會返回一個 Supplier 實例,調用該實例的 get() 方法,會創(chuàng)建一個中間結果容器。

@Override
public Supplier<List<String>> supplier() {
    return new Supplier<List<String>>() {
        @Override
        public List<String> get() {
            List<String> container = new ArrayList<>();

            return container;
        }
    };
}

考慮到收集的元素類型 String,這里的中間結果容器類型為 ArrayList 。

根據收集過程的需要,中間結果容器可以是任意的數據結構。

逐一遍歷流中的每個元素,處理完成之后,添加到中間結果

accumulator() 方法會返回一個 BiConsumer 實例,它有一個 accept() 方法,

參數1:中間結果 參數2:流中遍歷到的某個元素

遍歷過程是 Java 自動完成的,每遍歷一個元素,會自動調用 BiConsumer.accept 方法。我們只需要在方法中實現元素的處理過程,然后把元素的處理結果添加到中間結果中就可以了。

@Override
public BiConsumer<List<String>, String> accumulator() {
    return new BiConsumer<List<String>, String>() {
        @Override
        public void accept(List<String> container, String col) {
            container.add(col);
        }
    };
}

這個示例中,流中的元素不需要任何處理,直接添加至中間結果即可。

中間結果轉換成最終結果

finisher() 方法會返回一個 Fuction 實例,它有一個 apply() 方法,

參數:中間結果 返回:最終結果

遍歷過程結束之后,Java 會自動調用 Function.apply() 方法,將中間結果轉換成最終結果。

@Override
public Function<List<String>, List<String>> finisher() {
    return new Function<List<String>, List<String>>() {
        @Override
        public List<String> apply(List<String> container) {
            return container;
        }
    };
}

這個示例中,中間結果就是最終結果,不需要任何處理,直接返回中間結果即可。

combiner()是做什么的?

流中的元素可以被并行處理,這樣的流稱為并行流。并行流相當于把一個大流切分成多個小流,內部使用多線程,并行處理這些小流。每一個小流遍歷完成之后,都會產生一個小的中間結果,需要將這些小的中間結果合并成一個大的中間結果。

假設有兩個小流,收集開始時,會創(chuàng)建兩個中間結果:

中間結果也是通過 Supplier.get() 方法創(chuàng)建的。

并行遍歷兩個小流,將各自流的處理結果添加到各自的中間結果中:

combiner() 方法會返回一個 BinaryOperator 實例,它有一個 apply() 方法:

參數1:中間結果1 參數2:中間結果2 返回:中間結果

Java 會在合適的時機自動調用 BinaryOperator.apply() 方法,將小的中間結果合并成大的中間結果。

@Override
public BinaryOperator<List<String>> combiner() {
    return new BinaryOperator<List<String>>() {
        @Override
        public List<String> apply(List<String> container1, List<String> container2) {
            container1.addAll(container2);
            return container1;
        }
    };
}

characteristics()是什么的?

characteristics() 會返回一個 Characteristics(枚舉)集合實例,用于設定收集器的特性,支持以下三個值:

  • CONCURRENT

    收集器支持并發(fā)使用

  • UNORDERED

    收集器不保證元素順序

  • IDENTITY_FINISH

    收集器中間結果可直接轉換成最終結果

Java 可以根據這些特性值,保證收集器正確地、有效率地執(zhí)行。

完整代碼

Collector<String, List<String>, List<String>> collector = new Collector<String, List<String>, List<String>>() {
    @Override
    public Supplier<List<String>> supplier() {
        return new Supplier<List<String>>() {
            @Override
            public List<String> get() {
                List<String> container = new ArrayList<>();

                return container;
            }
        };
    }

    @Override
    public BiConsumer<List<String>, String> accumulator() {
        return new BiConsumer<List<String>, String>() {
            @Override
            public void accept(List<String> container, String col) {
                container.add(col);
            }
        };
    }

    @Override
    public BinaryOperator<List<String>> combiner() {
        return new BinaryOperator<List<String>>() {
            @Override
            public List<String> apply(List<String> container1, List<String> container2) {
                container1.addAll(container2);
                return container1;
            }
        };
    }

    @Override
    public Function<List<String>, List<String>> finisher() {
        return new Function<List<String>, List<String>>() {
            @Override
            public List<String> apply(List<String> container) {
                return container;
            }
        };
    }

    @Override
    public Set<Characteristics> characteristics() {
        return new HashSet<>();
    }
};

col1List = records.stream()
        .map(Record::getCol1)
        .collect(collector);
log.info("col1List: {}", Json.toJson(col1List));

到此這篇關于Java 流處理之收集器的文章就介紹到這了,更多相關Java 收集器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Java協程編程之Loom項目實戰(zhàn)記錄

    Java協程編程之Loom項目實戰(zhàn)記錄

    這篇文章主要介紹了Java協程編程之Loom項目嘗鮮,如果用嘗鮮的角度去使用Loom項目,可以提前窺探JVM開發(fā)者們是如何基于協程這個重大特性進行開發(fā)的,這對于提高學習JDK內核代碼的興趣有不少幫助,需要的朋友可以參考下
    2021-08-08
  • Spring中的事務管理實例詳解

    Spring中的事務管理實例詳解

    這篇文章主要介紹了Spring中的事務管理,以實例形式詳細分析了事務的概念與特性以及事物管理的具體用法,需要的朋友可以參考下
    2014-11-11
  • java控制Pdf自動打印的小例子

    java控制Pdf自動打印的小例子

    java控制Pdf自動打印的小例子,需要的朋友可以參考一下
    2013-04-04
  • javaweb實現百度GPS定位接口(經緯度)

    javaweb實現百度GPS定位接口(經緯度)

    這篇文章主要介紹了javaweb實現百度GPS定位接口(經緯度),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • Java數據結構之隊列的簡單定義與使用方法

    Java數據結構之隊列的簡單定義與使用方法

    這篇文章主要介紹了Java數據結構之隊列的簡單定義與使用方法,簡單描述了隊列的功能、特點,并結合java實例形式分析了隊列的簡單定義與使用方法,需要的朋友可以參考下
    2017-10-10
  • 學習java編程后可以走哪些職業(yè)道路

    學習java編程后可以走哪些職業(yè)道路

    在本篇文章里給大家介紹了關于學習java后的職業(yè)道路,以及需要學習的相關知識內容,有興趣的朋友們可以跟著學習下。
    2022-11-11
  • Java?MethodHandles介紹與反射對比區(qū)別詳解

    Java?MethodHandles介紹與反射對比區(qū)別詳解

    這篇文章主要為大家介紹了Java?MethodHandles介紹與反射對比區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • Java編程實現逆波蘭表達式代碼示例

    Java編程實現逆波蘭表達式代碼示例

    本文主要對Java算法逆波蘭表達式的相關內容作了介紹,涉及逆波蘭表達式的定義已經在Java中的實現,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • this關鍵字詳解

    this關鍵字詳解

    這篇文章主要介紹了this關鍵字,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • Spring?Boot+Aop記錄用戶操作日志實戰(zhàn)記錄

    Spring?Boot+Aop記錄用戶操作日志實戰(zhàn)記錄

    在Spring框架中使用AOP配合自定義注解可以方便的實現用戶操作的監(jiān)控,下面這篇文章主要給大家介紹了關于Spring?Boot+Aop記錄用戶操作日志實戰(zhàn)的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-04-04

最新評論

隆尧县| 遵义县| 高州市| 绵阳市| 治县。| 湖南省| 庆阳市| 莱西市| 和政县| 开封县| 英吉沙县| 宜君县| 南通市| 绥中县| 蓝山县| 玛多县| 凌源市| 海门市| 五寨县| 池州市| 兰州市| 柳林县| 全南县| 彭州市| 兰坪| 昌乐县| 威信县| 武山县| 和顺县| 嘉定区| 崇义县| 枝江市| 诏安县| 东安县| 大化| 台湾省| 吉林省| 宁南县| 四川省| 科技| 基隆市|