java stream group_Java8 Stream之group

1 介绍

2 Collectors的groupingBy方法

使用Java 8 提供的Stream API 可以以声明式的方法来处理集合中的数据。静态工厂方法 Collectors.groupingBy()和Collectors.groupingByConcurrent()提供类似SQL语言中的‘GROUP BY’的功能。两个工厂方法用于根据某些属性对集合中的元素分组并将分组结果存储在Map(ConcurrentMap)中。

groupingBy方法的三个重载版本:

参数为分类函数

static Collector>> groupingBy(Function super T,? extends K> classifier)

参数为分类函数、Collector对象(执行reduce操作)

static Collector>

groupingBy(Function super T,? extends K> classifier, Collector super T,A,D> downstream)

参数为分类函数、Supplier对象(提供Map接口的实现,用于分类结果的存储)和Collector对象(执行reduce操作)

static > Collector

groupingBy(Function super T,? extends K> classifier,

Supplier mapFactory, Collector super T,A,D> downstream)

2.1 示例代码设置

文章类型

public enum ArticleType {

NEWS,

REVIEW,

GUIDE

}

文章,包括文章标题、作者、文章类型和文章获得的喜欢数。

public class Article {

String title;

String author;

ArticleType type;

int likes;

}

待处理的文章列表

List articles = Arrays.asList(...);

2.2 基于单属性分组

单属性分组只需要一个分类函数作为参数,分类函数会作用于流的所有元素,分类函数的返回值将作为分组结果的键。

基于作者姓名的分组如下:

Map> byAuthor = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor));

Map> byType = articles.stream()

.collect(Collectors.groupingBy(article -> article.getType()));

2.3 分组结果的键为复杂类型

分类函数不仅限于返回一个纯量或字符串,分类结果的键可以是任何类型,但是要求实现了必要的equals和hashcode方法。

基于作者姓名和文章类型的分组如下:

Map, List> complexKeMap = articles.stream()

.collect(Collectors.groupingBy(new Function>() {

@Override

public Tuple2 apply(Article article) {

return new Tuple2<>(article.getAuthor(), article.getType());

}

}));

2.4 修改分组结果的值类型

默认分组结果的值类型为List,可以通过提供第二个参数来修改返回的类型。返回Set类型的示例代码如下:

// modify the return type Map to Map

Map> authorSet = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor, Collectors.toSet()));

2.5 多条件分组

下面的例子,首先按照作业分组,然后对分组的结果再按照文章类型分组:

Map>> chainGroup = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor, Collectors.groupingBy(Article::getType)));

2.6 对分组结果执行Reduce操作

一般分组结果的值类型为List,可以根据需要对List执行Reduce操作,比如获取List中某个属性值最大最小值的元素。

计算作者文章的获得的喜欢数的平均值:

Map averageLike = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor, Collectors.averagingInt(Article::getLikes)));

计算作者文章得到的喜欢数的总和:

Map sumLike = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor, Collectors.summingInt(Article::getLikes)));

计算每位作者最受欢迎的文章:

Map> maxLikeByAuthor = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor, Collectors.maxBy(Comparator.comparingInt(Article::getLikes))));

System.out.println(maxLikeByAuthor);

计算每位作者最不受欢迎的文章:

Map> minLikeByAuthor = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor, Collectors.minBy(Comparator.comparingInt(Article::getLikes))));

2.7 获取分组结果的统计数据

Stream专门提供了计算分组结果统计值的接口,统计值包括:最大值、最小值、平均值、总数、总和五个指标。

Map summaryStatistics = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor, Collectors.summarizingInt(Article::getLikes)));

2.8 修改分组结果值的类型

Map modifyGroupType = articles.stream()

.collect(Collectors.groupingBy(Article::getAuthor, Collectors.mapping(Article::getTitle, joining("||"))));

System.out.println(modifyGroupType);

2.9 返回支持并发操作的Map

ConcurrentMap> concurrentGroup = articles.parallelStream()

.collect(Collectors.groupingByConcurrent(Article::getAuthor));

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

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

相关文章

Serverless 场景排查问题利器 : 函数实例命令行操作

简介&#xff1a;实例命令行功能的推出希望能消除用户使用 Serverless 的“最后一公里”&#xff0c;直接将真实的函数运行环境展现给用户。 背景介绍 全托管的 Serverless 计算平台能给用户带来更少的运维代价、更强的稳定性和更快的弹性能力&#xff0c;在 Serverless 落地…

从运维域看 Serverless 真的就是万能银弹吗?

简介&#xff1a;极客时间《Serverless 入门课》作者秦粤最新文章: 再次讨论正当时的 Serverless。文章分为三个部分&#xff0c;分别是 复杂化for 云开发商; 简化 for 开发者&#xff0c;以及团队使用 Serverless 的最佳场景。 作者说 在开始本篇内容前我想与各位开发者达成几…

java http 1.1_java11新特性HttpClient

1、get请求ObjectMapper objectMapper new ObjectMapper();HttpClient client HttpClient.newHttpClient();HttpRequest request HttpRequest.newBuilder().uri(URI.create(softPhoneAddress "/api/cfg/selectAgentBySkill?skilldbid" queueId)).GET().build()…

多任务学习模型之ESMM介绍与实现

简介&#xff1a;本文介绍的是阿里巴巴团队发表在 SIGIR’2018 的论文《Entire Space Multi-Task Model: An Effective Approach for Estimating Post-Click Conversion Rate》。文章基于 Multi-Task Learning (MTL) 的思路&#xff0c;提出一种名为ESMM的CVR预估模型&#xff…

java pinyin4j 首字母_通讯录之按汉字首字母排序 --java--pinyin4J

最近开发手机端OA系统通讯录时遇到了用汉字首字母排序的问题&#xff0c;各种谷歌后发现了一个轮子pinyin4J&#xff0c;这个轮子是可以将汉字转换成字母拼音&#xff0c;个人觉得很好用&#xff0c;完美的解决了排序的问题&#xff0c;分享一下。一.工具介绍pinyin4j是一个支持…

助力开源生态繁荣,统信软件建设中国桌面操作系统根社区

继 React、SUSE、RedHat 宣布对俄罗斯停服后&#xff0c;近日 Ubuntu 开发商 Canonical 在俄乌冲突下也宣布对俄罗斯企业停止支持和专业服务。 这给我们敲醒了警钟&#xff1a;因为Ubuntu 事件瞄准桌面操作系统&#xff0c;桌面操作系统用户庞大&#xff0c;其安全性属于系统级…

一文详解 | 开放搜索兼容Elasticsearch做召回引擎

简介&#xff1a;开放搜索发布开源兼容版&#xff0c;支持阿里云Elasticsearch做搜索召回引擎&#xff0c;本文详细介绍阿里云ES用户如何通过接入开放搜索兼容版丰富行业分词库&#xff0c;提升查询语义理解能力&#xff0c;无需开发、算法投入&#xff0c;即可获得淘系同款搜索…

人人都是 Serverless 架构师 | 现代化 Web 应用开发实战

简介&#xff1a;本篇实战将介绍如何以超低成本构建动态的 Web 站点&#xff0c;并且实现灵活扩展&#xff0c;限流等效果&#xff0c;最后再跟大家聊一聊“现代应用”的相关概念。 相信很多同学都有过想要拥有自己的 Web 站点的想法&#xff0c;但是如果想要搭建动态的站点&a…

Gartner:如何在中国成功应用多云模式

作者 | Gartner研究总监 杜勇 供稿 | Gartner 当前&#xff0c;中国政府鼓励行业企业通过云计算技术来实施数字化转型&#xff0c;从而加速经济增长。许多企业机构已部署了私有云和单一供应商混合云&#xff0c;以实现这一目标。为了满足全球业务和本地业务需要分别部署在不同的…

java socket 线程池_程序员:java使用线程池和TCP实现简单多轮聊天系统

最近在做物联网项目,需要使用TCP和传感器进行双向交互,通过这种渠道,找到了下面的代码,写成博客主要也是为了记录一下,以后用到随时可以看。代码实现服务端package com.tcp;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.…

阿里云李飞飞:中国数据库的时与势

简介&#xff1a;数据库、操作系统和中间件并列为三大基础软件&#xff0c;无论是在银行存取款&#xff0c;还是进行健康码查询&#xff0c;我们的日常应用和企业业务背后都离不开数据库。可以说&#xff0c;没有数据库&#xff0c;就难以构建数字化底座。过去的40多年&#xf…

java 最大矩形_Java实现 LeetCode 85 最大矩形

85. 最大矩形给定一个仅包含 0 和 1 的二维二进制矩阵&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面积。示例:输入:[[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”,“1”,“1”,“1”],[“1”,“0”,“0”,“1”,“0”]]输出: …

阿里巴巴超大规模 Kubernetes 基础设施运维体系介绍

简介&#xff1a;ASI 作为阿里集团、阿里云基础设施底座&#xff0c;为越来越多的云产品提供更多专业服务&#xff0c;托管底层 K8s 集群&#xff0c;屏蔽复杂的 K8s 门槛、透明几乎所有的基础设施复杂度&#xff0c;并用专业的产品技术能力兜底稳定性&#xff0c;让云产品只需…

数据库资深“学霸”再启程,专访数据库初创公司矩阵起源全球 CTO 田丰博士

师出名门&#xff0c;工业界履历从大厂首席工程师到创业公司 CTO&#xff0c;并能一直从事底层系统的核心研发工作&#xff0c;可能是很多优秀技术人向往的光鲜履历。不过抛弃大厂的光鲜稳定工作和成功的创业项目&#xff0c;再次加入初创公司&#xff0c;则需要比常人更大的魄…

Spring官方RSocket Broker 0.3.0发布: 快速构建你的RSocket架构

简介&#xff1a;Spring官方的RSocket Broker其实开发已经非常久了&#xff0c;我以为会伴随着Spring Cloud 2021.0发布的&#xff0c;但是没有发生。不过Spring RSocket Broker还是发布了最新的0.3版本&#xff0c;虽然还是预览版&#xff0c;但目前已经可用&#xff0c;考虑官…

python sqlite3事务_python使用上下文管理器实现sqlite3事务机制

如题&#xff0c;本文记录如何使用python上下文管理器的方式管理sqlite3的句柄创建和释放以及事务机制。1、python上下文管理(with)python上下文管理(context)&#xff0c;解决的是这样一类问题&#xff0c;在进入逻辑之前需要进行一些准备工作&#xff0c;在退出逻辑之前需要进…

Redis 6 中的多线程是如何实现的!?

作者 | 张彦飞allen来源 | 开发内功修炼Redis 是一个高性能服务端的典范。它通过多路复用 epoll 来管理海量的用户连接&#xff0c;只使用一个线程来通过事件循环来处理所有用户请求&#xff0c;就可以达到每秒数万 QPS 的处理能力。下图是单线程版本 Redis 工作的核心原理图单…

如何构建流量无损的在线应用架构 | 专题开篇

简介&#xff1a;本篇是整个《如何构建流量无损的在线应用架构》系列的第一篇&#xff0c;这一系列共三篇&#xff0c;旨在使用最为朴素的语言将影响在线应用流量稳定性的技术问题做一个归类&#xff0c;这些问题的解决方案有的只是一些代码层面的细节&#xff0c;有的需要工具…

云原生时代的运维体系进化

简介&#xff1a;基于容器、Kubernetes 等云原生技术&#xff0c;提供的开放社区标准、不可变基础设施、声明式 API 会成为企业 CloudOps 的最佳实践&#xff0c;也将在这个基础上推进数据化、智能化体系建设&#xff0c;将运维复杂性进一步下沉&#xff0c;让企业可以聚焦于自…

python 抽象语法树_用python演示一个简单的AST(抽象语法树)

假设对‘a 3 * b‘进行解释&#xff0c;其中a2&#xff0c;b5代码很简单&#xff0c;就不再进行详细的解释了。Num lambda env, n: nVar lambda env, x: env[x]Add lambda env, a, b:_eval(env, a) _eval(env, b)Mul lambda env, a, b:_eval(env, a) * _eval(env, b)_eva…