当前位置: 首页 > news >正文

Java8 Stream 之groupingBy 分组讲解

本文主要讲解:Java 8 Stream之Collectors.groupingBy()分组示例

Collectors.groupingBy() 分组之常见用法
功能代码:

/**
     * 使用java8 stream groupingBy操作,按城市分组list
     */
    public void groupingByCity() {
        Map<String, List<Employee>> map = employees.stream().collect(Collectors.groupingBy(Employee::getCity));
        map.forEach((k, v) -> {
            System.out.println(k + " = " + v);
        });
    }
Collectors.groupingBy() 分组之统计每个分组的count
功能代码:

/**
     * 使用java8 stream groupingBy操作,按城市分组list统计count
     */
    public void groupingByCount() {
        Map<String, Long> map = employees.stream()
                .collect(Collectors.groupingBy(Employee::getCity, Collectors.counting()));
 
        map.forEach((k, v) -> {
            System.out.println(k + " = " + v);
        });
    }
Collectors.groupingBy() 分组之统计分组平均值
功能代码:

/**
     * 使用java8 stream groupingBy操作,按城市分组list并计算分组年龄平均值
     */
    public void groupingByAverage() {
        Map<String, Double> map = employees.stream()
                .collect(Collectors.groupingBy(Employee::getCity, Collectors.averagingInt(Employee::getAge)));
 
        map.forEach((k, v) -> {
            System.out.println(k + " = " + v);
        });
    }
Collectors.groupingBy() 分组之统计分组总值
功能代码:

/**
     * 使用java8 stream groupingBy操作,按城市分组list并计算分组销售总值
     */
    public void groupingBySum() {
        Map<String, Long> map = employees.stream()
                .collect(Collectors.groupingBy(Employee::getCity, Collectors.summingLong(Employee::getAmount)));
 
        map.forEach((k, v) -> {
            System.out.println(k + " = " + v);
        });
 
        // 对Map按照分组销售总值逆序排序
        Map<String, Long> sortedMap = new LinkedHashMap<>();
        map.entrySet().stream().sorted(Map.Entry.<String, Long> comparingByValue().reversed())
                .forEachOrdered(e -> sortedMap.put(e.getKey(), e.getValue()));
 
        sortedMap.forEach((k, v) -> {
            System.out.println(k + " = " + v);
        });
    }

Collectors.groupingBy() 分组之Join分组List
功能代码:

/**
     * 使用java8 stream groupingBy操作,按城市分组list并通过join操作连接分组list中的对象的name 属性使用逗号分隔
     */
    public void groupingByString() {
        Map<String, String> map = employees.stream().collect(Collectors.groupingBy(Employee::getCity,
                Collectors.mapping(Employee::getName, Collectors.joining(", ", "Names: [", "]"))));
 
        map.forEach((k, v) -> {
            System.out.println(k + " = " + v);
        });
    }
Collectors.groupingBy() 分组之转换分组结果List -> List
功能代码:

/**
     * 使用java8 stream groupingBy操作,按城市分组list,将List转化为name的List
     */
    public void groupingByList() {
        Map<String, List<String>> map = employees.stream().collect(
                Collectors.groupingBy(Employee::getCity, Collectors.mapping(Employee::getName, Collectors.toList())));
 
        map.forEach((k, v) -> {
            System.out.println(k + " = " + v);
            v.stream().forEach(item -> {
                System.out.println("item = " + item);
            });
        });
    }
Collectors.groupingBy() 分组之转换分组结果List -> Set
功能代码:

/**
     * 使用java8 stream groupingBy操作,按城市分组list,将List转化为name的Set
     */
    public void groupingBySet() {
        Map<String, Set<String>> map = employees.stream().collect(
                Collectors.groupingBy(Employee::getCity, Collectors.mapping(Employee::getName, Collectors.toSet())));
 
        map.forEach((k, v) -> {
            System.out.println(k + " = " + v);
            v.stream().forEach(item -> {
                System.out.println("item = " + item);
            });
        });
    }
Collectors.groupingBy() 分组之使用对象分组List
功能代码:

/**
     * 使用java8 stream groupingBy操作,通过Object对象的成员分组List
     */
    public void groupingByObject() {
        Map<Manage, List<Employee>> map = employees.stream().collect(Collectors.groupingBy(item -> {
            return new Manage(item.getName());
        }));
 
        map.forEach((k, v) -> {
            System.out.println(k + " = " + v);
        });
    }
Collectors.groupingBy() 分组之使用两个成员分组List
功能代码:

/**
     * 使用java8 stream groupingBy操作, 基于city 和name 实现多次分组
     */
    public void groupingBys() {
        Map<String, Map<String, List<Employee>>> map = employees.stream()
                .collect(Collectors.groupingBy(Employee::getCity, Collectors.groupingBy(Employee::getName)));
 
        map.forEach((k, v) -> {
            System.out.println(k + " = " + v);
            v.forEach((i, j) -> {
                System.out.println(i + " = " + j);
            });
        });
    }
自定义Distinct对结果去重
功能代码

/**
     * 使用java8 stream groupingBy操作, 基于Distinct 去重数据
     */
    public void groupingByDistinct() {
        List<Employee> list = employees.stream().filter(distinctByKey(Employee :: getCity))
                .collect(Collectors.toList());;
 
        list.stream().forEach(item->{
            System.out.println("city = " + item.getCity());
        });
        
        
    }
 
    /**
     * 自定义重复key 规则
     * @param keyExtractor
     * @return
     */
    private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        Set<Object> seen = ConcurrentHashMap.newKeySet();
        return t -> seen.add(keyExtractor.apply(t));
    }
完整源代码:

package com.stream;
 
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
 
/**
 * Java 8 Stream 之groupingBy 分组讲解
 * 
 * @author zzg
 *
 */
public class Java8GroupBy {
 
    List<Employee> employees = new ArrayList<Employee>();
 
    /**
     * 数据初始化
     */
    public void init() {
        List<String> citys = Arrays.asList("湖南", "湖北", "江西", "广西 ");
        for (int i = 0; i < 10; i++) {
            Random random = new Random();
            Integer index = random.nextInt(4);
            Employee employee = new Employee(citys.get(index), "姓名" + i, (random.nextInt(4) * 10 - random.nextInt(4)),
                    (random.nextInt(4) * 1000 - random.nextInt(4)));
            employees.add(employee);
        }
    }
 
    /**
     * 使用java8 stream groupingBy操作,按城市分组list
     */
    public void groupingByCity() {
        Map<String, List<Employee>> map = employees.stream().collect(Collectors.groupingBy(Employee::getCity));
        map.forEach((k, v) -> {
            System.out.println(k + " = " + v);
        });
    }
 
    /**
     * 使用java8 stream groupingBy操作,按城市分组list统计count
     */
    public void groupingByCount() {
        Map<String, Long> map = employees.stream()
                .collect(Collectors.groupingBy(Employee::getCity, Collectors.counting()));
 
        map.forEach((k, v) -> {
            System.out.println(k + " = " + v);
        });
    }
 
    /**
     * 使用java8 stream groupingBy操作,按城市分组list并计算分组年龄平均值
     */
    public void groupingByAverage() {
        Map<String, Double> map = employees.stream()
                .collect(Collectors.groupingBy(Employee::getCity, Collectors.averagingInt(Employee::getAge)));
 
        map.forEach((k, v) -> {
            System.out.println(k + " = " + v);
        });
    }
 
    /**
     * 使用java8 stream groupingBy操作,按城市分组list并计算分组销售总值
     */
    public void groupingBySum() {
        Map<String, Long> map = employees.stream()
                .collect(Collectors.groupingBy(Employee::getCity, Collectors.summingLong(Employee::getAmount)));
 
        map.forEach((k, v) -> {
            System.out.println(k + " = " + v);
        });
 
        // 对Map按照分组销售总值逆序排序
        Map<String, Long> sortedMap = new LinkedHashMap<>();
        map.entrySet().stream().sorted(Map.Entry.<String, Long> comparingByValue().reversed())
                .forEachOrdered(e -> sortedMap.put(e.getKey(), e.getValue()));
 
        sortedMap.forEach((k, v) -> {
            System.out.println(k + " = " + v);
        });
    }
 
    /**
     * 使用java8 stream groupingBy操作,按城市分组list并通过join操作连接分组list中的对象的name 属性使用逗号分隔
     */
    public void groupingByString() {
        Map<String, String> map = employees.stream().collect(Collectors.groupingBy(Employee::getCity,
                Collectors.mapping(Employee::getName, Collectors.joining(", ", "Names: [", "]"))));
 
        map.forEach((k, v) -> {
            System.out.println(k + " = " + v);
        });
    }
 
    /**
     * 使用java8 stream groupingBy操作,按城市分组list,将List转化为name的List
     */
    public void groupingByList() {
        Map<String, List<String>> map = employees.stream().collect(
                Collectors.groupingBy(Employee::getCity, Collectors.mapping(Employee::getName, Collectors.toList())));
 
        map.forEach((k, v) -> {
            System.out.println(k + " = " + v);
            v.stream().forEach(item -> {
                System.out.println("item = " + item);
            });
        });
    }
 
    /**
     * 使用java8 stream groupingBy操作,按城市分组list,将List转化为name的Set
     */
    public void groupingBySet() {
        Map<String, Set<String>> map = employees.stream().collect(
                Collectors.groupingBy(Employee::getCity, Collectors.mapping(Employee::getName, Collectors.toSet())));
 
        map.forEach((k, v) -> {
            System.out.println(k + " = " + v);
            v.stream().forEach(item -> {
                System.out.println("item = " + item);
            });
        });
    }
 
    /**
     * 使用java8 stream groupingBy操作,通过Object对象的成员分组List
     */
    public void groupingByObject() {
        Map<Manage, List<Employee>> map = employees.stream().collect(Collectors.groupingBy(item -> {
            return new Manage(item.getName());
        }));
 
        map.forEach((k, v) -> {
            System.out.println(k + " = " + v);
        });
    }
 
    /**
     * 使用java8 stream groupingBy操作, 基于city 和name 实现多次分组
     */
    public void groupingBys() {
        Map<String, Map<String, List<Employee>>> map = employees.stream()
                .collect(Collectors.groupingBy(Employee::getCity, Collectors.groupingBy(Employee::getName)));
 
        map.forEach((k, v) -> {
            System.out.println(k + " = " + v);
            v.forEach((i, j) -> {
                System.out.println(i + " = " + j);
            });
        });
    }
 
    /**
     * 使用java8 stream groupingBy操作, 基于Distinct 去重数据
     */
    public void groupingByDistinct() {
        List<Employee> list = employees.stream().filter(distinctByKey(Employee :: getCity))
                .collect(Collectors.toList());;
 
        list.stream().forEach(item->{
            System.out.println("city = " + item.getCity());
        });
        
        
    }
 
    /**
     * 自定义重复key 规则
     * @param keyExtractor
     * @return
     */
    private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        Set<Object> seen = ConcurrentHashMap.newKeySet();
        return t -> seen.add(keyExtractor.apply(t));
    }
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Java8GroupBy instance = new Java8GroupBy();
        instance.init();
        instance.groupingByCity();
        instance.groupingByCount();
        instance.groupingByAverage();
        instance.groupingBySum();
        instance.groupingByString();
        instance.groupingByList();
        instance.groupingBySet();
        instance.groupingByObject();
        instance.groupingBys();
        instance.groupingByDistinct();
 
    }
 
    class Employee {
        private String city;
        private String name;
        private Integer age;
        private Integer amount;
 
        public String getCity() {
            return city;
        }
 
        public void setCity(String city) {
            this.city = city;
        }
 
        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;
        }
 
        public Integer getAmount() {
            return amount;
        }
 
        public void setAmount(Integer amount) {
            this.amount = amount;
        }
 
        public Employee(String city, String name, Integer age, Integer amount) {
            super();
            this.city = city;
            this.name = name;
            this.age = age;
            this.amount = amount;
        }
 
        public Employee() {
            super();
        }
    }
 
    class Manage {
        private String name;
 
        public String getName() {
            return name;
        }
 
        public void setName(String name) {
            this.name = name;
        }
 
        public Manage(String name) {
            super();
            this.name = name;
        }
 
        public Manage() {
            super();
        }
    }
 
}
github 地址: 待补全

本文参考:
————————————————
版权声明:本文为CSDN博主「在奋斗的大道」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhouzhiwengang/article/details/112319054

http://www.lryc.cn/news/125057.html

相关文章:

  • 优哲SSD大文件写性能测试
  • Python基础教程: json序列化详细用法介绍
  • 一张图看懂 USDT三种类型地址 Omni、ERC20、TRC20的区别
  • SegFormer之模型训练
  • Azure资源命名和标记决策指南
  • 【在一个升序数组中插入一个数仍升序输出】
  • 图像去雨、去雪、去雾论文学习记录
  • YARN框架和其工作原理流程介绍
  • 多维时序 | MATLAB实现ZOA-CNN-BiGRU-Attention多变量时间序列预测
  • centos上下载redis
  • 黑马项目一阶段面试58题 Web14题(二)
  • 软考高项-思维导图34-36(计算机高级系统项目管理师)
  • C++的stack和queue+优先队列
  • Ubuntu 18.04.6 Android Studio Giraffe adb logcat 无法使用
  • Python采集天气数据,做可视化分析【附源码】
  • 优维低代码实践:自定义模板
  • 电商3D产品渲染简明教程
  • 探索未来:元宇宙与Web3的无限可能
  • GraphQL(六)登录态校验Directive
  • 强大的AI语言模型
  • 成集云 | 鼎捷ERP采购单同步钉钉 | 解决方案
  • 【Kubernetes】Kubernetes的PV和PVC的用法
  • 【Redis】Redis三种集群模式-主从、哨兵、集群各自架构的优点和缺点对比
  • Python爬虫:如何使用Python爬取网站数据
  • 剑指offer专题2:队列和栈
  • pytorch入门-神经网络
  • kafka使用心得(二)
  • (二)掌握最基本的Linux服务器用法——Linux下简单的C/C++ 程序、项目编译
  • 应急响应-钓鱼邮件的处理思路溯源及其反制
  • Hadoop Hbase Hive 版本对照一览