Java8 collectors類

先看下collectors類的結構,裏面有collector接口的實現 CollectorImpl以及自己定義的一些靜態方法
在這裏插入圖片描述
構造對象

@Data
    @AllArgsConstructor
    static class Achievement{
        private String name;
        private double score;
        private String date;
    }
    static List<Achievement> getData(){
        List<Achievement> list = new ArrayList<>();
        list.add(new Achievement("wang",80,"2017-10-20"));
        list.add(new Achievement("wang",90,"2017-5-20"));
        list.add(new Achievement("li",90,"2018-10-20"));
        list.add(new Achievement("zhao",50,"2017-10-20"));
        list.add(new Achievement("qian",60,"2017-10-22"));
        list.add(new Achievement("sun",20,"2017-10-23"));
        list.add(new Achievement("sun",20,"2017-11-23"));
        return list;
    }

實現不同的方法

 /*尋找最大值*/
    private static void c1(){
        Optional<Integer> collect = IntStream.rangeClosed(0, 100).boxed().collect(Collectors.maxBy(Comparator.comparingInt(a -> a)));
        System.out.println(collect.get());
    }
    /*尋找最小值*/
    private static void c2(){
        Optional<Integer> collect = Stream.generate(Math::random).limit(20).map(a -> {
            Double s = (a * 1000);
            return s.intValue();
        }).collect(Collectors.minBy(Comparator.comparingInt(a -> a)));
        System.out.println(collect.get());
    }
    /*統計數量*/
    private static void c3(){
        Long collect = Stream.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10).collect(Collectors.counting());
        System.out.println(collect);
    }
    /*彙總求和*/
    private static void c4(){
        Integer collect = Stream.iterate(0, n -> n + 2).limit(100).collect(Collectors.summingInt(a -> a));
        System.out.println(collect);
    }
    /*連接字符串*/
    private static void c5(){
        String collect = Stream.of("上海", "快倉", "科技", "有限", "公司").collect(Collectors.joining());
        System.out.println(collect);
    }
    /*單級分組*/
    private static void c6(){
        Map<String, List<Achievement>> collect = getData().stream().collect(Collectors.groupingBy(Achievement::getName));
        System.out.println(collect);
    }
    /*多級分組*/
    private static void c7(){
        Map<String, Map<Double, List<Achievement>>> collect = getData().stream().collect(Collectors.groupingBy(Achievement::getName, Collectors.groupingBy(Achievement::getScore)));
        System.out.println(collect);
    }
    /*按組統計*/
    private static void c8(){
        Map<String, Long> collect = getData().stream().collect(Collectors.groupingBy(Achievement::getName, Collectors.counting()));
        System.out.println(collect);
    }
    /*按組收集*/
    private static void c9(){
        Map<String, Optional<Achievement>> collect = getData().stream().collect(Collectors.groupingBy(Achievement::getName, Collectors.maxBy(Comparator.comparingInt(a -> (int) a.getScore()))));
        System.out.println(collect);
    }
    /*分區*/
    private static void c10(){
        Map<Boolean, List<Achievement>> collect = getData().stream().collect(Collectors.partitioningBy(a -> a.getScore() >= 60));
        System.out.println(collect);
    }
    /*分區分組*/
    private static void c11(){
        Map<Boolean, Map<String, List<Achievement>>> collect = getData().stream().collect(Collectors.partitioningBy(a -> a.getScore() >= 60, Collectors.groupingBy(Achievement::getName)));
        System.out.println(collect);
    }
    /*轉換*/
    private static void c12(){
        List<String> collect = getData().stream().collect(Collectors.mapping(Achievement::getName, Collectors.toList()));
        System.out.println(collect);
    }
    /*收集後處理*/
    public void c13(){
        Achievement collect = getData().stream().collect(Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparingDouble(Achievement::getScore)), Optional::get));
        System.out.println(collect);
    }

    /*分組*/
    public void c14(){
        Map<String,String> map = getData().stream().collect(toMap(Achievement::getName,
                Achievement::getDate,(s, a) -> s + ", " + a));
        System.out.println(map);
    }

方法調用

public static void main(String[] args) {
        CollectorsTest collectorsTest = new CollectorsTest();
        collectorsTest.c14();
    }

結果

{qian=2017-10-22, wang=2017-10-20, 2017-5-20, zhao=2017-10-20, sun=2017-10-23, 2017-11-23, li=2018-10-20}

具體方法說明
在這裏插入圖片描述
collectors 輔助類,就是一個工廠,給開發者提供非常常見的collector的實現方法,靜態方法

this.supplier = supplier; //中間結果容器
this.accumulator = accumulator;//累加器
this.combiner = combiner;//結合器
this.finisher = finisher;//完成器
this.characteristics = characteristics;

參考 Java8中Collectors詳解
java8 快速實現List轉map 、分組、過濾等操作

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章