Java8 Stream Collectors

本文详细介绍Java Stream API中的Collectors类,展示如何使用收集器将Stream转换为集合、字符串及统计数据,包括列表转换、集合创建、映射构建、计数、求和、平均值计算、最大最小值获取、字符串连接等实用功能。

Collectors 类实现了很多归约操作,例如将流转换成集合和聚合元素。返回列表、字符串、或产生统计结果的收集器
实例如下:

static class Student {
        private String address;

        private String name;

        private Integer age;

        public Student(String address, String name, Integer age) {
            super();
            this.address = address;
            this.name = name;
            this.age = age;
        }

        public String getAddress() {
            return address;
        }

        public void setAddress(String address) {
            this.address = address;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public Integer getAge() {
            return age;
        }

        public void setAge(Integer age) {
            this.age = age;
        }

        @Override
        public String toString() {
            return "Student [address=" + address + ", name=" + name + ", age=" + age + "]";
        }

    }
    public static List<Student> list = new ArrayList<>();

    static {
        list.add(new Student("北京", "依依", 17));
        list.add(new Student("上海", "尔尔", 18));
        list.add(new Student("广州", "散散", 19));
        list.add(new Student("深圳", "思思", 20));
        list.add(new Student("杭州", "呜呜", 21));
        list.add(new Student("杭州", "柳柳", 22));
    }
    public static void main(String[] args) {
        collectTest();
    }

    public static void collectTest() {
        // 转list
        List<String> nameList = list.stream().map(student -> student.getName()).collect(Collectors.toList());
        System.out.println(nameList);
        // 转set
        Set<String> addressSet = list.stream().map(student -> student.getAddress()).collect(Collectors.toSet());
        System.out.println(addressSet);
        // 转map,需要指定key和value,Function.identity()表示当前的Emp对象本身
        Map<String, Student> nameMap = list.stream().collect(Collectors.toMap(Student::getName, Function.identity()));
        System.out.println(nameMap);
        // 计算元素中的个数
        Long count = list.stream().collect(Collectors.counting());
        System.out.println(count);
        // 计算元素中数据求和 summingInt summingLong,summingDouble
        Integer sumAges = list.stream().collect(Collectors.summingInt(Student::getAge));
        System.out.println(sumAges);
        // 计算元素中数据平均值 averagingInt,averagingLong,averagingDouble
        Double aveAges = list.stream().collect(Collectors.averagingInt(Student::getAge));
        System.out.println(aveAges);
        // 综合处理: 求最大值,最小值,平均值,求和操作 summarizingInt,summarizingLong,summarizingDouble
        IntSummaryStatistics intSummary = list.stream().collect(Collectors.summarizingInt(Student::getAge));
        // 平均值
        System.out.println(intSummary.getAverage());
        // 最大值
        System.out.println(intSummary.getMax());
        // 最小值
        System.out.println(intSummary.getMin());
        // 求和
        System.out.println(intSummary.getSum());
        // 连接字符串
        String strName = list.stream().map(emp -> emp.getName()).collect(Collectors.joining());
        System.out.println(strName);
        // 连接字符串,中间分隔符
        String strName1 = list.stream().map(emp -> emp.getName()).collect(Collectors.joining("-中间分隔符-"));
        System.out.println(strName1);
        // 连接字符串,前缀,后缀和中间分隔符
        String strName2 = list.stream().map(emp -> emp.getName()).collect(Collectors.joining("-中间分隔符-", "前缀", "后缀"));
        System.out.println(strName2);
        // maxBy 按照比较器中的比较结果刷选 最大值
        Optional<Integer> maxAge = list.stream().map(emp -> emp.getAge()).collect(Collectors.maxBy(Integer::max));
        System.out.println(maxAge);
        // minBy 按照比较器中的比较结果刷选 最小值
        Optional<Integer> minAge = list.stream().map(emp -> emp.getAge()).collect(Collectors.minBy(Integer::min));
        System.out.println(minAge);
        // 归约操作
        Optional<Integer> sumAge = list.stream().map(emp -> emp.getAge()).collect(Collectors.reducing((x, y) -> x + y));
        System.out.println(sumAge);
        // 分操作 groupingBy 根据地址,把原list进行分组
        Map<String, List<Student>> mapGroup = list.stream().collect(Collectors.groupingBy(Student::getAddress));
        System.out.println(mapGroup);
        // partitioningBy 分区操作 需要根据类型指定判断分区
        Map<Boolean, List<Integer>> partitioningMap = list.stream().map(emp -> emp.getAge()).collect(Collectors.partitioningBy(emp -> emp > 20));
        System.out.println(partitioningMap);
    }

文章仅作为个人学习整理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值