Java8 Stream 之groupingBy 分组讲解

这篇具有很好参考价值的文章主要介绍了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文章来源地址https://www.toymoban.com/news/detail-641534.html

到了这里,关于Java8 Stream 之groupingBy 分组讲解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java8 Stream分组groupBy后,取单一字段值、取列表第一个值方式

    java8 Stream中groupBy的拓展用法。 取单一字段值、取列表第一个值方式

    2024年02月14日
    浏览(26)
  • Java8使用stream流给List<Map<String,Object>>分组(多字段key)

    Java8使用 stream流 给ListMapString,Object根据字段key 分组 一、项目场景: 从已得到的List集合中,根据某一元素(这里指map的key)进行分组,筛选出需要的数据。 如果是SQL的话则使用 group by 直接实现,代码的方式则如下: 使用到stream流的 Collectors.groupingBy() 方法。 二、代码实现 1、首

    2024年02月02日
    浏览(35)
  • Java8用Stream流一行代码实现数据分组统计,排序,最大值、最小值、平均值、总数、合计

    Java8对数据处理可谓十分流畅,既不改变数据,又能对数据进行很好的处理,今天给大家演示下,用Java8的Stream如何对数据进行分组统计,排序,求和等 汇总统计方法 找到汇总统计的方法。这些方法属于java 8的汇总统计类。 getAverage(): 它返回所有接受值的平均值。 getCount():

    2023年04月20日
    浏览(49)
  • 使用java8 新特性stream流对List<Map<String, Object>>集合进行遍历、过滤、查询、去重、排序、分组

    对于一个ListMapString, Object类型的数据,可以使用Java 8的新特性stream流来进行遍历、过滤、查询、去重、排序、分组等操作。 遍历: 过滤: 查询: 去重: 排序: 分组:

    2024年02月10日
    浏览(44)
  • java根据分组函数GroupingBy进行多个条件组合分组

    在SQL中经常会用到分组,我们也常常遇到一些组合分组的场景。 java8分组 传统写法(单个字段分组) 场景:根据 城市 进行分组 使用的是方法引用:User::getCity 来完成分组 java8分组 传统写法(多个字段分组) 场景:根据 城市,性别进行分组 一般的写法会是下面的这种写法,

    2023年04月19日
    浏览(30)
  • Windows11配置Java8开发环境 - JDK1.8

    1、下载JDK 我们要下载的是Oracle版本的JDK,我们首先进入Oracle的官网的Java下载页面:https://www.oracle.com/cn/java/technologies/downloads/ 一直往下滑 ,找到 Java8 —点击 Windows (如果你是其他系统选择你对应的系统即可)— 在下方根据你的电脑系统类型选择对应的X86或X64然后点击下载

    2024年02月10日
    浏览(35)
  • Java8 Stream流的合并

    最近的需求里有这样一个场景,要校验一个集合中每个对象的多个Id的有效性。比如一个Customer对象,有3个Id: id1 , id2 , id3 ,要把这些Id全部取出来,然后去数据库里查询它们是否存在。 通常情况下,我们都是从集合中取出对象的某一个字段,像这样: 现在要取3个字段,

    2024年02月02日
    浏览(38)
  • Java8中Stream详细用法大全

    Java 8 是一个非常成功的版本,这个版本新增的Stream,配合同版本出现的Lambda ,给我们操作集合(Collection)提供了极大的便利。Stream流是JDK8新增的成员,允许以声明性方式处理数据集合,可以把Stream流看作是遍历数据集合的一个高级迭代器。Stream 是 Java8 中处理集合的关键抽

    2023年04月08日
    浏览(67)
  • Java8 函数式编程stream流

    Java 8 中新增的特性旨在帮助程序员写出更好的代码,其中对核心类库的改进是很关键的一部分,也是本章的主要内容。对核心类库的改进主要包括集合类的 API 和新引入的流(Stream),流使程序员得以站在更高的抽象层次上对集合进行操作。下面将介绍stream流的用法。 ​场景

    2024年02月15日
    浏览(24)
  • Java8的Stream流的学习

    Stream可以由数组或集合创建,对流的操作分为两种: 中间操作,每次返回一个新的流,可以有多个。 终端操作,每个流只能进行一次终端操作,终端操作结束后流无法再次使用。终端操作会产生一个新的集合或值。 stream和parallelStream的简单区分: stream是顺序流,由主线程按

    2024年02月07日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包