Stream.Collect 收集器的使用案例

public static void main(String[] args) {
        
        Person p1 = new Person("zhangsan",20);
        Person p2 = new Person("lisi",30);
        Person p3 = new Person("wangwu",40);
        Person p4 = new Person("趙六",40);
        List<Person> list = Arrays.asList(p1, p2, p3, p4);

        System.out.println("獲取流中所有元素");
        List<Person> collect = list.stream().collect(Collectors.toList());
        collect.forEach(System.out::println);

        //收集統計數據的對象 例如 最大最小平均總和  這個對象只返回數據 不返回對象 例如最小:返回20  而不是這個person
        IntSummaryStatistics intSummaryStatistics = list.stream()
            .collect(Collectors.summarizingInt(Person::getAge));

        System.out.println("-----------------------------");

        System.out.println("統計流中元素個數");
        System.out.println("方式一stream.count() : " + list.stream().count());
        System.out.println("方式二stream.collect(Collectors.counting()): " + list.stream().collect(Collectors.counting()));
        System.out.println("方式三:" + intSummaryStatistics.getCount());

        System.out.println("-------------------");

        System.out.println("獲取流中  年齡最小的元素");
        System.out.print("獲取最小方式一:");
        list.stream().collect(Collectors.minBy(Comparator.comparingInt(Person::getAge))).ifPresent(System.out::println);
        System.out.println("獲取最小方式二:" + intSummaryStatistics.getMin());
        System.out.println("-------------------");

        System.out.println("獲取流中  年齡最大的元素");
        System.out.print("獲取最大方式一:");
        list.stream().collect(Collectors.maxBy(Comparator.comparingInt(Person::getAge))).ifPresent(System.out::println);
        System.out.println("獲取最大方式二:" + intSummaryStatistics.getMax());

        System.out.println("-------------------");

        //年齡平均數
        Double average = list.stream().collect(Collectors.averagingInt(Person::getAge));
        System.out.println("平均年齡方式一:" + average);
        System.out.println("平均年齡方式二:" + intSummaryStatistics.getAverage());

        System.out.println("-------------------");

        System.out.println("年齡總和方式一:" + intSummaryStatistics.getSum());
        Integer sum = list.stream().collect(Collectors.summingInt(Person::getAge));
        System.out.println("年齡總和方式二:" + sum);

        System.out.println("-------------------");
        System.out.println("拼接所有人的性名");
        String personNames = list.stream().map(Person::getName).collect(Collectors.joining("  "));
        System.out.println("所有人的性名:" + personNames);

        System.out.println("-------------------");
        System.out.println("一級分組");
        System.out.println("根據年齡分組");
        Map<Integer, List<Person>> map = list.stream()
            .collect(Collectors.groupingBy(Person::getAge));
        System.out.println(map);

        System.out.println("二級分組  先根據年齡分組 在根據xing'm'z");
        Map<Integer, Map<String, List<Person>>> mapMap = list.stream()
            .collect(Collectors.groupingBy(Person::getAge, Collectors.groupingBy(Person::getName)));
        System.out.println(mapMap);

        System.out.println("-------------------");

        System.out.println("分區 <30 , >=30");
        Map<Boolean, List<Person>> listMap = list.stream()
            .collect(Collectors.partitioningBy(person -> person.getAge() < 30));
        System.out.println(listMap);

        System.out.println("-------------------");

        System.out.println("分區 <30 , >=30 後 >=30 這個分區再次分區  =30 和 >30");
        Map<Boolean, Map<Boolean, List<Person>>> map1 = list.stream().collect(Collectors
            .partitioningBy(person -> person.getAge() >= 30,
                Collectors.partitioningBy(person -> person.getAge() == 30)));
        System.out.println(map1);

        System.out.println("--------------");
        System.out.println("分區後統計數量");
        Map<Boolean, Long> map2 = list.stream().collect(
            Collectors.partitioningBy(person -> person.getAge() < 30, Collectors.counting()));
        System.out.println(map2);


    }

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