java8-07-自定義Collector-ToList

[TOC]

聲明

這一系列文章旨在幫助大家理解 Collector 的執(zhí)行流程,至于實現的是否高效、是否優(yōu)雅、是否合理等暫且不論。


現在來實現一個和 java.util.stream.Collectors#toList 一樣效果的 ToListCollector。

若對 Collector 的各個流程有疑問請移駕此處:http://blog.csdn.net/hylexus/article/details/78941843

簡單實現

static class ToListCollector<T> implements Collector<T, List<T>, List<T>> {

    @Override
    public Supplier<List<T>> supplier() {
        return () -> Lists.newArrayList();
    }

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

    @Override
    public BinaryOperator<List<T>> combiner() {
        return (acc1, acc2) -> {
            acc1.addAll(acc2);
            return acc1;
        };
    }

    @Override
    public Function<List<T>, List<T>> finisher() {
        return (acc) -> acc;
    }

    @Override
    public Set<Characteristics> characteristics() {
        Set<Characteristics> ret = new HashSet<>();
        ret.add(Characteristics.CONCURRENT);
        ret.add(Characteristics.IDENTITY_FINISH);
        return Collections.unmodifiableSet(ret);
    }
}

簡化代碼

static class ToListCollector2<T> implements Collector<T, List<T>, List<T>> {

    @Override
    public Supplier<List<T>> supplier() {
        return ArrayList::new;
    }

    @Override
    public BiConsumer<List<T>, T> accumulator() {
        return List::add;
    }

    @Override
    public BinaryOperator<List<T>> combiner() {
        return (acc1, acc2) -> {
            acc1.addAll(acc2);
            return acc1;
        };
    }

    @Override
    public Function<List<T>, List<T>> finisher() {
        return Function.identity();
    }

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

使用自定義Collector

@Test
public void testListCollector() {
    List<Integer> list = IntStream.rangeClosed(1, 5).boxed()
      .collect(new ToListCollector<>());
    System.out.println(list);

    List<Integer> list2 = Stream.iterate(1, i -> i + 1).limit(5)
      .collect(new ToListCollector2<>());
    System.out.println(list2);
}

博客源碼

https://github.com/hylexus/blog-src/blob/master/java-core/src/test/java/cn/hylexus/lambda/CollectorTest.java

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    光劍書架上的書閱讀 4,178評論 2 8
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現,斷路器,智...
    卡卡羅2017閱讀 136,525評論 19 139
  • Int Double Long 設置特定的stream類型, 提高性能,增加特定的函數 無存儲。stream不是一...
    patrick002閱讀 1,321評論 0 0
  • Java8 in action 沒有共享的可變數據,將方法和函數即代碼傳遞給其他方法的能力就是我們平常所說的函數式...
    鐵牛很鐵閱讀 1,357評論 1 2
  • 主進程更新UI: 會阻塞 MainActivity.java Java文件 activity_main.xml ...
    暖熊熊閱讀 322評論 1 1

友情鏈接更多精彩內容