JDK 8流和分组

我在JDK 8中的Stream-Powered Collections Functionality中介绍了将JDK 8的Streams与Java集合一起使用的强大功能。 我没有在那篇文章中讨论groupingBy Collector 减少操作的使用,因此在这篇文章中解决了分组问题。

这篇博文中的示例将演示如何将集合支持的流与groupingBy收集器组合在一起,以按提供的分类指定的组重新组织底层集合的数据。 这些示例基于我先前的文章JDK 8中的Stream-Powered Collections Functionality中描述的Movie类和Set of Movie类。

下一个代码清单演示了如何使用简单的语句将提供的Movie Set分组为电影等级(关键字) Map到具有该等级(值)的电影。 groupingBy收集器将此Map作为键类型(在这种情况下为MpaaRating )的映射提供给要分组的对象类型List (在此情况下为Movie )。

/*** Demonstrate use of JDK 8 streams and Collectors.groupingBy to* group movies by their MPAA ratings.*/
private static void demonstrateGroupingByRating()
{final Map<MpaaRating, List<Movie>> moviesByRating =movies.stream().collect(groupingBy(Movie::getMpaaRating));out.println("Movies grouped by MPAA Rating: " + moviesByRating);
}

在刚刚显示的示例中(以及在本文后面的示例中),静态导入java.util.stream.Collectors.groupingBy允许我不需要使用Collectors类名来限制groupingBy调用的范围。 这个简单的代码片段通过将电影的等级与返回的电影等级的Map映射键映射到与每个等级相关的电影List来将电影分组。 这是当提供的Movie set与我先前引用的帖子中的相同时的输出示例。


根据MPAA分级的电影:{PG13 = [电影:盗梦空间(2010),Science_FICTION,PG13、13],R = [电影:肖申克的救赎(1994),DRAMA,R,1],PG = [电影:攻略失落的方舟(1981),动作,PG,31,电影:回到未来(1985),SCIENCE_FICTION,PG,49,电影:星球大战:第五集–帝国反击(1980),SCIENCE_FICTION,PG,12 ]}

刚刚展示的功能的一种特定用途是生成一个唯一键Map ,该键MapCollection中的对象,并Map到具有该键的Collection对象。 例如,在需要通过map反复快速查找对象但在SetList而不是在Map提供感兴趣的对象时,这可能很有用。 假装电影具有唯一的标题(它们仅适用于我的小型电影),那么可以如下面的代码清单所示完成这些功能。

/*** Demonstrate use of JDK 8 streams and Collectors.groupingBy to* group movies by their title.*/
private static void demonstrateGroupingByTitle()
{final Map<String, List<Movie>> moviesByTitle =movies.stream().collect(groupingBy(Movie::getTitle));out.println("Movies grouped by title: " + moviesByTitle);
}

假设标题对于原始集合中的每个电影都是唯一的,则上面的代码将电影标题映射到仅包含该标题适用的电影的单元素List 。 任何希望按标题快速查找电影的客户端都可以调用moviesByTitle.get(String).get(0)来获取与该标题相对应的完整Movie对象。 接下来显示使用我的简单电影集进行此操作的输出。


按标题分组的电影:{The Shawshank Redemption = [电影:The Shawshank Redemption(1994),DRAMA,R,1],《星球大战:第五集–帝国反击》 = [电影:星球大战:第五集–帝国反击Back(1980),SCIENCE_FICTION,PG,12],Back to the Future = [电影:回到未来(1985),SCIENCE_FICTION,PG,49],《夺宝奇兵》 [Ravies of the Lost Ark( 1981),ACTION,PG,31],Inception = [电影:Inception(2010),Science_FICTION,PG13,13]}

可以通过两个不同的特征进行分组。 这允许将Collection按一个特征分组,然后将这些组中的每个分组按第二个特征进行子分组。 例如,以下代码清单按等级然后按流派将电影分组。

/*** Demonstrate use of JDK 8 streams and cascaded groupingBy* to group movies by ratings and then by genres within ratings.*/
private static void demonstrateGroupingByRatingAndGenre()
{final Map<MpaaRating, Map<Genre, List<Movie>>> moviesByRatingAndGenre =movies.stream().collect(groupingBy(Movie::getMpaaRating, groupingBy(Movie::getGenre)));out.println("Movies by rating and genre: " + moviesByRatingAndGenre);
}

刚显示的代码列表首先按等级将基础电影分组,然后再次将每部电影与特定等级的分组进行分组,但是这次按类型进行分组。 换句话说,我们通过收视率和流派获得了两级电影。 接下来显示我的一组简单电影的输出。


按等级和流派的电影:{PG13 = {SCIENCE_FICTION = [电影:盗梦空间(2010),Science_FICTION,PG13,13]}},R = {DRAMA = [电影:肖申克的救赎(1994),DRAMA,R,1]} ,PG = {SCIENCE_FICTION = [电影:回到未来(1985),Science_FICTION,PG,49,电影:《星球大战:第五集–帝国反击》(1980),Science_FICTION,PG,12],ACTION = [电影:夺宝奇兵(1981),ACTION,PG,31]}}

通过groupingBy收集器,可以轻松地将ListSet元素分组为映射,并以分组特征为键,并将属于List中每个组的对象与该分组特征键相关联。 这提供了Map所有优点,包括使用JDK 8中引入的一些方便的Map方法。

翻译自: https://www.javacodegeeks.com/2015/03/jdk-8-streams-and-grouping.html

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

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

相关文章

ERP开发中应用字符串解析实现界面翻译智能化

ERP中要实现界面多语言的功能&#xff0c;则要对各种情况的字符串进行处理并作出翻译。有些字符串的翻译是有规律可行的&#xff0c;遵循相应的模板模式&#xff0c;解析字符串&#xff0c;可以实现机器翻译的效果。 请看帐套数据库表的设计ADCOMP CREATE TABLE dbo.ADCOMP(REC…

参数详解 复制进程_如何优化PostgreSQL逻辑复制

How to Optimize PostgreSQL Logical Replication逻辑复制( Logical Replication )或 Pglogical 是表级别的复制。两者都是基于 WAL 的复制机制&#xff0c;允许在两个实例之间复制指定表的WAL 。这两个看起来让人迷惑&#xff0c;到底有什么区别呢&#xff1f; Logical Replic…

我发现我的Java重拍了!

在一月份&#xff0c;我写了一篇文章&#xff0c;介绍了一些我希望在Java语言中看到的变化&#xff0c;这些变化会让我更加喜欢它&#xff08;并使它变得更现代&#xff09;。 很多人建议使用许多JVM语言&#xff0c;但我基本上不予使用&#xff0c;因为这不是我想要的。 我希望…

Android Studio使用说明

声明: 本博客文章原创类别的均为个人原创&#xff0c;版权所有。转载请注明出处: http://blog.csdn.net/ml3947,另外本人的个人博客:http://www.wjfxgame.com。 凌晨的Google I/O大会上&#xff0c;宣布了Android Studio&#xff0c;引起了现场开发者的一片欢呼。那么&#x…

有些窗口底部被任务栏挡住了_开始使用 Tint2 吧,一款 Linux 中的开源任务栏

Tint2 是我们在开源工具系列中的第 14 个工具&#xff0c;它将在 2019 年提高你的工作效率&#xff0c;能在任何窗口管理器中提供一致的用户体验。-- Kevin Sonney每年年初似乎都有疯狂的冲动想提高工作效率。新年的决心&#xff0c;渴望开启新的一年&#xff0c;当然&#xff…

从jHiccup开始

写完“如何在生产中检测和诊断慢速代码”一文后&#xff0c;我受到读者的鼓励&#xff0c;尝试从Azul系统尝试jHiccup 。 去年&#xff0c;我参加了jHiccup的创建者Gil Tene的演讲&#xff0c;探讨了测量延迟的正确方法&#xff0c;其中&#xff0c;他向我们介绍了jHiccup。 它…

nullnull使用PL/SQL获取创建用户的语句

在写这篇文章之前&#xff0c;xxx已经写过了几篇关于改nullnull主题的文章,想要了解的朋友可以去翻一下之前的文章 Create procedure: create or replace procedure get_case_sqls_for_ddls_ver1 ascursor get_username isselect username from dba_users;beginfor l_user in g…

axios发送post数据后台收不到_使用axios post 提交数据,后台获取不到

https://www.cnblogs.com/yiyi17/p/9409249.html(copyhttps://www.cnblogs.com/loveyaxin/p/8385694.html(copy问题场景场景很简单&#xff0c;就是一个正常 axios post 请求&#xff1a;axios({headers: {deviceCode: A95ZEF1-47B5-AC90BF3},method: post,url: /api/lockServe…

在JDK 8中连接字符串

JDK 8引入了语言功能&#xff0c;例如lambda表达式 &#xff0c; 流 &#xff0c;甚至是新的Date / Time API &#xff0c;这些都会改变我们编写Java应用程序的方式。 但是&#xff0c;还有一些新的API和功能可能不太“改变游戏规则”&#xff0c;但仍为Java编程语言带来了更大…

华为内部面试题库---(6)

1.在SMP体系结构中&#xff0c;中断亲和性是指将一个或者多个中断绑定到特定CPU core上运行&#xff0c;下列说法错误的是&#xff1a;A.每个硬件设备都会在/proc/irq下有个中断号命令的目录来标志中断亲和性B.IRQ#目录下smp_affinity文件&#xff0c;通过设置CPU位掩码&#x…

基元需要走吗?

我目前正在使用JSF作为视图技术&#xff0c;使用JPA作为持久层的企业应用程序。 它可能是支持bean或服务方法中的某种东西&#xff0c;但令我震惊&#xff1a;是否有充分的理由在企业应用程序中使用原语&#xff1f; 当我开始围绕J2SE 1.2使用Java进行编程&#xff08;或者是J…

输入参数_太实用!输入参数1秒算出功率,这款计算工具又快又准

随着互联网红利的不断加深&#xff0c;到了后期&#xff0c;不断地各种工具开始涌现&#xff0c;方便了很多用户&#xff0c;填补了市场上的很多空白&#xff0c;有生活娱乐类、提高效率类、垂直专业类、系统工具类等等。工业行业作为各行各业的大头&#xff0c;机械化、智能化…

功能工厂模式

您是否需要一种非常快速的方法来制作Factory对象&#xff1f; 然后&#xff0c;您需要lambda或其他函数传递&#xff01; 它不仅快速&#xff0c;而且非常简单。 我敢打赌&#xff0c;如果您对Lambdas相当满意&#xff0c;那么您只需阅读标题就可以做到这一点。 如果您是其中之…

指向二维数组的指针测试

定义a为二维数组后&#xff0c;有三种成份&#xff1a;数组本身、3个一维数组&#xff08;a的每一行对应一个一维数组&#xff09;、12个数组元素&#xff0c; 由此就有三种指针及对应的指针变量&#xff0c; &a和int &#xff08;*p1&#xff09;&#xff3b;3&#xff3d…

python视频流传输_基于OpenCV的网络实时视频流传输的实现

很多小伙伴都不会在家里或者办公室安装网络摄像头或监视摄像头。但是有时&#xff0c;大家又希望能够随时随地观看视频直播。大多数人会选择使用IP摄像机(Internet协议摄像机)而不是CCTV(闭路电视)&#xff0c;因为它们具有更高的分辨率并降低了布线成本。在本文中&#xff0c;…

如何编写NetBeans插件

是否想在NetBeans IDE中添加功能或自动执行某些操作&#xff1f; 跟随我们编写您的第一个NetBeans插件。 让我们超越简单的工具栏示例 &#xff0c;创建一个可以自动更新的插件。 该代码基于NetBeans的WakaTime插件 。 我们的示例插件将仅打印Hello World语句&#xff0c;并在…

单机最大tcp连接数

单机最大tcp连接数 网络编程 在tcp应用中&#xff0c;server事先在某个固定端口监听&#xff0c;client主动发起连接&#xff0c;经过三路握手后建立tcp连接。那么对单机&#xff0c;其最大并发tcp连接数是多少&#xff1f; 如何标识一个TCP连接 在确定最大连接数之前&#xf…

用了fastapi还需要nginx_nginx 与 fastdfs 的配置过程,已经越过了许多坑,我跪着进入了欢迎页面。。。...

nginx 与 fastdfs 的配置过程&#xff0c;已经越过了许多坑&#xff0c;我跪着进入了欢迎页面。。。上面的是 fastdfs 与 nginx 的官网&#xff0c;我从这里面跌跌撞撞的走出来了&#xff0c;下面是我总结出来的一条平坦的路&#xff0c;小伙伴们可以参考参考。我下面的攻略其实…

Spring Batch教程–最终指南

这是Spring批处理教程&#xff0c;它是Spring框架的一部分。 Spring Batch提供了可重用的功能&#xff0c;这些功能对于处理大量记录至关重要&#xff0c;包括日志记录/跟踪&#xff0c;事务管理&#xff0c;作业处理统计信息&#xff0c;作业重新启动&#xff0c;跳过和资源管…

Neurocomputing 投稿注意事项

1. *.tex 和 *.bib 都以Manuscript项&#xff08;Item&#xff09;提交 &#xff08;abstract.tex除外&#xff09;2. abstract.tex以Abstract项&#xff08;Item&#xff09;提交3. *.eps以Figure项&#xff08;Item&#xff09;提交4. biographies.pdf以Biography of the aut…