欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java Stream中自定義Collector實(shí)現(xiàn)復(fù)雜數(shù)據(jù)收集的方法

 更新時(shí)間:2024年08月19日 08:43:49   作者:碼到三十五  
Java Stream API中的Collector接口是一個(gè)強(qiáng)大的工具,它允許我們自定義數(shù)據(jù)收集、轉(zhuǎn)換和聚合的過程,,本文介紹了Java Stream中自定義Collector實(shí)現(xiàn)復(fù)雜數(shù)據(jù)收集方法,需要的朋友可以參考下

1. Collector接口的作用

Collector接口定義了數(shù)據(jù)收集、轉(zhuǎn)換和聚合的基本操作,使得從Stream中收集到特定的數(shù)據(jù)結(jié)構(gòu)或執(zhí)行復(fù)雜的聚合操作成為可能。Collector接口為Stream操作提供了一個(gè)終止方法,將Stream的處理結(jié)果收集到一個(gè)特定的容器中。

2. Collector接口的組成

Collector接口包含以下五個(gè)主要方法:

  1. supplier():返回一個(gè)新的結(jié)果容器的Supplier。這個(gè)方法用于創(chuàng)建用于存儲(chǔ)收集結(jié)果的容器。

  2. accumulator():接收一個(gè)結(jié)果容器和一個(gè)流中的元素,將元素添加到結(jié)果容器中。這是累積元素的核心方法,用于將流中的元素逐個(gè)添加到結(jié)果容器中。

  3. combiner():接收兩個(gè)結(jié)果容器,合并它們。在并行流處理中,如果有多個(gè)結(jié)果容器被生成,則使用combiner()方法將它們合并為一個(gè)容器。

  4. finisher():接收一個(gè)結(jié)果容器,返回最終結(jié)果。這個(gè)方法通常用于將結(jié)果容器轉(zhuǎn)換為最終想要的形式,例如,對(duì)容器中的元素進(jìn)行排序或過濾。

  5. characteristics():返回一個(gè)不可變的Set,包含收集器的特性。這些特性用于優(yōu)化流處理過程,如并行流處理或結(jié)果的無序性。

3. Collector接口的工作原理

Collector接口的工作原理基于上述五個(gè)方法的協(xié)作。先通過supplier()方法創(chuàng)建一個(gè)新的結(jié)果容器。然后,遍歷Stream中的每個(gè)元素,使用accumulator()方法將元素添加到結(jié)果容器中。在并行流處理中,如果有多個(gè)結(jié)果容器被生成,則使用combiner()方法將它們合并為一個(gè)容器。最后,通過finisher()方法將結(jié)果容器轉(zhuǎn)換為最終想要的形式,并返回。

4. Collector的預(yù)定義實(shí)現(xiàn)Collectors

Collectors可以看做是Collector接口的實(shí)現(xiàn)工廠,提供了多個(gè)用于數(shù)據(jù)收集、轉(zhuǎn)換和聚合的預(yù)定義收集器,如toList()、toSet()、toMap()、joining()、counting()、summingInt()、averagingInt()等。這些收集器利用Collector接口實(shí)現(xiàn),使得從Stream中收集數(shù)據(jù)變得更為方便和高效。

List<String> list = Stream.of("a", "b", "c")
.collect(Collectors.toList());

Map<Character, List<String>> grouped = Stream.of("a", "b", "c")
.collect(Collectors.groupingBy(s -> s.charAt(0)));

String joined = Stream.of("a", "b", "c")
.collect(Collectors.joining(", "));

如,toList()收集器通過調(diào)用new ArrayList<>()來創(chuàng)建一個(gè)新的結(jié)果容器,并使用accumulator()方法將流中的元素添加到結(jié)果容器中。toMap()收集器則創(chuàng)建一個(gè)新的HashMap,并使用提供的鍵函數(shù)和值函數(shù)將元素映射到Map的鍵和值上。

5. 自定義Collector的使用場(chǎng)景

通過實(shí)現(xiàn)Collector接口來自定義復(fù)雜的收集器,以滿足特定的數(shù)據(jù)處理需求。自定義Collector時(shí),要實(shí)現(xiàn)上述五個(gè)方法,并定義如何收集、轉(zhuǎn)換和聚合數(shù)據(jù)。

如,自定義Collector對(duì)Person對(duì)象進(jìn)行排序,并根據(jù)特定條件進(jìn)行分組:

public static class CustomCollector<T> implements Collector<Person, List<Person>, Map<String, List<Person>>> {
    @Override
    public Supplier<List<Person>> supplier() {
        return ArrayList::new;
    }

    @Override
    public BiConsumer<List<Person>, Person> accumulator() {
        return (list, person) -> list.add(person);
    }

    @Override
    public BinaryOperator<List<Person>> combiner() {
        return (list1, list2) -> {
            list1.addAll(list2);
            return list1;
        };
    }

    @Override
    public Function<List<Person>, Map<String, List<Person>>> finisher() {
        return list -> {
            Map<String, List<Person>> result = new HashMap<>();
            // 自定義排序規(guī)則
            list.sort((p1, p2) -> {
                if (p1.age != null && p2.age != null) {
                    return p1.age.compareTo(p2.age);
                } else if (p1.age != null) {
                    return -1;
                } else if (p2.age != null) {
                    return 1;
                } else {
                    return p1.name.compareTo(p2.name);
                }
            });

            // 自定義分組規(guī)則
            for (Person person : list) {
                if (result.containsKey(person.name.substring(0, 2))) {
                    result.get(person.name.substring(0, 2)).add(person);
                } else {
                    List<Person> group = new ArrayList<>();
                    group.add(person);
                    result.put(person.name.substring(0, 2), group);
                }
            }
            return result;
        };
    }

    @Override
    public Set<Collector.Characteristics> characteristics() {
        return EnumSet.of(Collector.Characteristics.IDENTITY_FINISH);
    }
}

自定義收集、轉(zhuǎn)換和聚合Person對(duì)象的邏輯。使用自定義的排序和分組規(guī)則,根據(jù)姓名和年齡將Person對(duì)象分組并排序,最終返回Map<String, List<Person>>。
通過自定義Collector,創(chuàng)建特定的收集器,而滿足復(fù)雜的數(shù)據(jù)處理需求。

使用方法:

import java.util.*;
public class CustomCollectorDemo {
    public static void main(String[] args) {
        List<Person> people = Arrays.asList(
                new Person("Alice", 25),
                new Person("Bob", 23),
                new Person("Charlie", 28),
                new Person("David", 25),
                new Person("Eva", 23),
                new Person("Frank", 28)
        );
        Map<String, List<Person>> result = people.stream()
                .collect(new CustomCollector<>());
        System.out.println(result);
    }

    static class Person {
        String name;
        Integer age;
        ...
    }
}

到此這篇關(guān)于Java Stream中自定義Collector實(shí)現(xiàn)復(fù)雜數(shù)據(jù)收集的方法的文章就介紹到這了,更多相關(guān)Java Stream自定義Collector數(shù)據(jù)收集內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SSH框架網(wǎng)上商城項(xiàng)目第15戰(zhàn)之線程、定時(shí)器同步首頁數(shù)據(jù)

    SSH框架網(wǎng)上商城項(xiàng)目第15戰(zhàn)之線程、定時(shí)器同步首頁數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了SSH框架網(wǎng)上商城項(xiàng)目第15戰(zhàn)之線程、定時(shí)器同步首頁數(shù)據(jù),感興趣的小伙伴們可以參考一下
    2016-06-06
  • 利用Mybatis?Plus實(shí)現(xiàn)一個(gè)SQL攔截器

    利用Mybatis?Plus實(shí)現(xiàn)一個(gè)SQL攔截器

    SQL攔截器是一種用于攔截和修改Mybatis執(zhí)行的SQL語句的工具,通過使用SQL攔截器,開發(fā)人員可以在執(zhí)行SQL語句之前或之后對(duì)其進(jìn)行修改或記錄,本文就來借助一下Mybatis-Plus實(shí)現(xiàn)一個(gè)SQL攔截器吧
    2023-05-05
  • java異步方式實(shí)現(xiàn)登錄

    java異步方式實(shí)現(xiàn)登錄

    這篇文章主要為大家詳細(xì)介紹了java異步方式實(shí)現(xiàn)登錄的相關(guān)資料,感興趣的朋友可以參考一下
    2016-05-05
  • QueryWrapper中查詢的坑及解決

    QueryWrapper中查詢的坑及解決

    這篇文章主要介紹了QueryWrapper中查詢的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2022-01-01
  • Lombok中@EqualsAndHashCode注解的使用及說明

    Lombok中@EqualsAndHashCode注解的使用及說明

    這篇文章主要介紹了Lombok中@EqualsAndHashCode注解的使用及說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • 解決springboot+activemq啟動(dòng)報(bào)注解錯(cuò)誤的問題

    解決springboot+activemq啟動(dòng)報(bào)注解錯(cuò)誤的問題

    這篇文章主要介紹了解決springboot+activemq啟動(dòng)報(bào)注解錯(cuò)誤的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • Java Condition條件變量提高線程通信效率

    Java Condition條件變量提高線程通信效率

    這篇文章主要介紹了Java Condition條件變量提高線程通信效率,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Java中equals與==的用法和區(qū)別

    Java中equals與==的用法和區(qū)別

    這篇文章主要給大家介紹了關(guān)于Java中equals與==的用法和區(qū)別的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Java BIO實(shí)現(xiàn)聊天程序

    Java BIO實(shí)現(xiàn)聊天程序

    這篇文章主要為大家詳細(xì)介紹了Java BIO實(shí)現(xiàn)聊天程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • Java編程GUI中的事件綁定代碼示例

    Java編程GUI中的事件綁定代碼示例

    這篇文章主要介紹了Java編程GUI中的事件綁定代碼示例,簡(jiǎn)單介紹了綁定的概念,然后分享了相關(guān)代碼,具有一定參考價(jià)值,需要的朋友可以參考下。
    2017-10-10

最新評(píng)論