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 stubJava8GroupBy 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();}}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/554695.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

win10 更新后不能切换输入法怎么办 win10输入法切换不了怎么解决

有win10用户说他在更新完系统后&#xff0c;在切换输入法的时候发现竟然切换不了无法切换&#xff0c;都不知道该怎么办了&#xff0c;这个小问题也是常有的&#xff0c;那么win10更新后不能切换输入法怎么办呢&#xff0c;下面小编给大家分享win10输入法切换不了的解决方法。 …

解决Java8 分组groupingBy 后排序不变的问题

在工作中遇到了java8 Stream groupBy 分组排序失效的问题 在此记录一下解决方案 预期效果&#xff1a; 按照年纪倒序并分组 实际结果&#xff1a;返回的数据是杂乱无章&#xff0c;并没有按照年纪倒序 示例代码如下&#xff1a; import java.util.Comparator; import java.u…

win8无线网络受限怎么办 win8网络受限的解决方法

很多时候&#xff0c;我们的用户经常会遇到win8无线网络受限的问题&#xff0c;从而导致电脑无法上网&#xff0c;这可如何是好呢?win8无线网络受限怎么办呢?下面&#xff0c;就给大家介绍几种win8无线网络受限的解决方法&#xff0c;提供给大家参考。 一、检测无线网络是否…

Stream.sorted

Stream sorted() Stream sorted​(Comparator<? super T> comparator) 对流中元素进行排序&#xff0c;排序后的元素放到新流中返回。 无参的方法按照自然顺序排序&#xff0c;有参数的方法根据自定义的比较器进行比较排序。 这两个方法都是有状态的中间操作&#xff0c…

教你win10怎么设置环境变量

电脑在运行一些程序的时候&#xff0c;我们经常都会需要修改系统的环境变量&#xff0c;添加路径&#xff0c;尤其是java运行环境配置和Android环境配置。为此&#xff0c;这里小编就以win10为例给大家讲解一下如何设置环境变量。 win10系统以界面优美、开机速度快、功能强大等…

Java8之Function函数、BiFunction函数详解

众所周知&#xff0c;Java8提供了一下非常重要的函数式接口。今天我们就来讲讲其中一个函数式接口-----Function接口。 下面的代码就是Function接口的全部代码。接下来我们逐个分析一下。 FunctionalInterface public interface Function<T, R>FunctionalInterface 表明…

告诉你win10自带录屏怎么使用

win10自带录屏怎么使用呢一些游戏玩家之前都是下载第三方屏幕录像软件录像&#xff0c;升级win10过后发现win10系统自带录屏功能&#xff0c;但是又不知道在哪打开?针对这个问题&#xff0c;我给大家带来了详细的操作步骤&#xff0c;一起来看看吧 不得不说win10系统实在是太…

Content-Type详解SpringBoot中如何根据Content-Type解析数据

文章目录Content-Type详解Content-Type是什么&#xff1f;Content-Type的格式Post请求中常见的Content-Type类型的结构SpringBoot中如何根据Content-Type解析数据一、接收get请求二、接收Post请求总结&#xff1a;Content-Type详解 Content-Type是什么&#xff1f; 在HTTP协议…

云骑士u盘装win8系统教程

云骑士u盘装win8系统教程 第一步 先在浏览器搜索云骑士官网&#xff1a;www.yunqishi.net 在官网上下载云骑士装机大师软件&#xff0c;下载好以后打开云骑士装机大师&#xff0c;打开后云骑士会自动配置用户的电脑信息&#xff0c;选择启动U盘界面。并且在电脑上插入U盘。 第…

U盘重装win7系统教程

第一步 先在浏览器搜索云骑士官网&#xff1a;www.yunqishi.net 在官网上下载云骑士装机大师软件&#xff0c;下载好以后打开云骑士装机大师&#xff0c;打开后云骑士会自动配置用户的电脑信息&#xff0c;选择启动U盘界面。并且在电脑上插入U盘。 2 第二步 接着就进入了选择系…

【编程技巧】Stream流之list转map、分组取每组第一条

前言 JDK1.8推出的stream流能极大的简化对集合的操作&#xff0c;让代码更美观&#xff0c;老规矩&#xff0c;直接上代码。 一、list转map 取list中对象的某个属性作为唯一key&#xff0c;对象作为value形成一个map集合&#xff0c;能够便于在后续业务中取值而不用遍历list…

番茄花园 Win10 系统 64位 全新纯净版 v2021.01

番茄花园 Win10 系统 64位 全新纯净版 v2021.01介绍&#xff1a; 1、支持IDE、SATA光驱启动恢复安装&#xff0c;支持WINDOWS下安装&#xff0c;支持PE下安装; 2、自动安装 AMD/Intel 双核 CPU 驱动和优化程序&#xff0c;发挥新平台的最大性能; 3、安装方便快速&#xff0c…

Java中String类常用方法详解: concat(),format(),charAt(),indexOf(),substring(),compareTo(),split(),replaceAll

文章目录1.连接字符串 concat()2.创建格式化对象 format()3.获取字符串某一位置字符 charAt()4.获取字符串的长度 length()5.查找子串在字符串中的位置 indexOf()6.截取字符串的子串 substring()7.字符串比较 compareTo()8.字符串大小写转换 toLowerCase()【大写换小写】 toUpp…

技术编辑帮你win7系统查看显卡容量大小的详细技巧

技术帮你win7系统查看显卡容量大小的详细技巧

索尼首次展示其Airpeak电影摄制无人机

索尼首次展示其Airpeak电影摄制无人机 在模糊的新闻稿和同样神秘的视频中宣布Airpeak仅仅两个月后&#xff0c;索尼就在虚拟CES 2021演示中展示了其新无人机。Airpeak支持Sony的Alpha系列无反光镜相机&#xff0c;并使用AI在飞过天空时保持图像稳定。 索尼首次展示其Airpeak电…

Guava中基础工具类Joiner的使用字符串拼接方法 joiner.on

Guava 中有一些基础的工具类&#xff0c;如下所列&#xff1a; 1&#xff0c;Joiner 类&#xff1a;根据给定的分隔符把字符串连接到一起。MapJoiner 执行相同的操作&#xff0c;但是针对 Map 的 key 和 value。 2&#xff0c;Splitter 类&#xff1a;与 Joiner 操作相反的类…

开机按f12怎么恢复系统 开机按f12恢复系统

有时候我们可能会遇到系统损坏或者是系统崩溃的问题,都会开不了机.那么开机按f12怎么恢复系统呢?用户并不知道如何操作,相信用户都很感兴趣该问题的解决方法,下面我在win7纯净版找到关于开机按f12恢复系统的详细操作教程,需要的朋友可以参考一下. 开机按f12怎么恢复系统 1.重启…

手把手教你dns服务器未响应导致无法上网怎么办

dns服务器未响应怎么办&#xff1f;其实每个问题都是有着相对应的原因外加解决方法的&#xff0c;我这刚好就有一篇关于如何解决dns服务器未响应的方法&#xff0c;现在就来分享给各位小伙伴们哈~ 不知道小伙伴们在使用电脑进行上网的时候&#xff0c;有木有遇到过这样子的一个…

Java 常用日志框架介绍

一、日志简介 1.1 日志是什么&#xff08;WHAT&#xff09; 日志&#xff1a;记录程序的运行轨迹&#xff0c;方便查找关键信息&#xff0c;也方便快速定位解决问题。 通常&#xff0c;Java程序员在开发项目时都是依赖Eclipse/IDEA等集成开发工具的Debug 调试功能来跟踪解决Bu…

淘集集收货地址在哪改 淘集集添加收货地址方法

淘集集app上购物方便且便宜&#xff0c;所以很多人都在使用。但有些人不知道该如何添加和修改收货地址。所以为大家详细介绍下方法。 淘集集收货地址在哪改 淘集集添加收货地址方法   淘集集收获地址在哪改   1、由于购物下单之前必须填写收货地址&#xff0c;因此有需要的…