jdk8分组统计字段和_JDK 8流和分组

jdk8分组统计字段和

我在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分组为电影等级(键)到具有该等级(值)的电影的MapgroupingBy收集器将此Map提供为要分组的对象类型List (在这种情况下为Movie )的键类型(在这种情况下为MpaaRating )的映射。

/*** 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 ,该Map将一个Collection中的对象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],《星球大战:第五集–帝国反击》 = [电影:星球大战:第五集–帝国反击返回(1980),SCIENCE_FICTION,PG,12],回到未来= [电影:回到未来(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

jdk8分组统计字段和

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

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

相关文章

C语言中,break和continue都是跳出循环,有啥区别?

首先说明&#xff1a;continue 只能用于循环语句中&#xff0c;而break可用于循环和 switch 语句&#xff0c;两者都是辅助循环&#xff1b;尽管如此&#xff0c;如果 switch 语句在一个循环中&#xff0c;continue便可作为 switch 语句的一部分&#xff1b;这种情况下&#xf…

java隐藏与覆盖_java中方法的隐藏和覆盖问题?

ok()方法在继承时候发生覆盖(重写)了吗&#xff1f;发生了。在子类B中的ok()方法拥有父类方法相同的方法名和参数列表(signature)&#xff0c;所以在这里发生了重写。调用B类对象的ok()方法会print "b"&#xff0c;父类方法被覆盖。如果是重写了&#xff0c;那定义一…

junit junit_使用junit做其他事情

junit junitjunit&#xff01;单元测试 Junit是Java单元测试框架。 通常&#xff0c;我们将它用于单元测试&#xff0c;但是很多时候我们也使用它来执行集成测试。 主要区别在于&#xff0c;单元测试测试单个单元&#xff0c;而集成测试则测试不同类如何协同工作。 这样&#x…

C 的 3种内存顺序,你都知道吗?

1、std::memory_order_relaxed “自由”内存顺序在原子类型上的操作以自由序列执行&#xff0c;没有任何同步关系&#xff0c;仅对此操作要求原子性。例如&#xff0c;在某一线程中&#xff0c;先写入A&#xff0c;再写入B。但是在多核处理器中观测到的顺序可能是先写入B&#…

java面试问题你遇到的难题_在Java面试中常遇到的技术问题汇总

在Java面试中常遇到的技术问题汇总 如果你正准备参加Java开发岗位面试,那么你会遇到很多有关多线程的面试问题。为什么呢?因为多线程和并发问题已经成为Java面试中必不可少的一部分。大多数企业在面试的时候都喜欢用棘手的Java线程面试题来考察面试者,他们希望确保面试者对J…

在邮件标头中找到无效的字符_在实践中重试HTTP标头

在邮件标头中找到无效的字符Retry-After是鲜为人知的HTTP响应标头。 让我引用RFC 2616&#xff08;HTTP 1.1规范&#xff09;的相关部分&#xff1a; 14.37重试后 Retry-After响应标头字段可与503 &#xff08; 服务不可用 &#xff09;响应一起使用&#xff0c;以指示请求客…

C 常见的面试知识点(上)

const 作用1&#xff0c;修饰变量&#xff0c;说明该变量不可以被改变2&#xff0c;修饰指针&#xff0c;分为指向常量的指针&#xff08;pointer to const&#xff09;和自身是常量的指针&#xff08;常量指针&#xff0c;const pointer&#xff09;3&#xff0c;修饰引用&…

brew下载的mysql卸载_Mac中mongoDB的安装与卸载步骤详解

前言MongoDB 是一个基于分布式文件存储的数据库&#xff0c;旨在为 web 应用提供可扩展的高性能数据存储解决方案。本文主要介绍的是关于在mac中安装卸载mongoDB数据库的方法&#xff0c;更多关于mongoDB的使用大家可以参考这篇文章&#xff1a;https://www.jb51.net/article/7…

java 指令重拍_我发现我的Java重拍了!

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

java post webservice_[java.webservice] 如何通过HttpPost从服务器上获得一个sessionid

javas Web Service is different from HttpPost, HttpGet and HttpResponse that kind of things. It is more easy to pass anything, any Object you like.如果要利用Web Service返回一个sessionid的话&#xff0c;可以使用从Server返回返回值的形式&#xff0c;也可以在Clie…

C 常见的面试知识点(下)

inline 内联函数的特征相当于把内联函数里面的内容写在调用内联函数处&#xff1b;相当于不用执行进入函数的步骤&#xff0c;直接执行函数体&#xff1b;相当于宏&#xff0c;却比宏多了类型检查&#xff0c;真正具有函数特性&#xff1b;编译器一般不内联包含循环、递归、swi…

php cdi_集成CDI和WebSockets

php cdi考虑尝试一个简单的Java EE 7原型应用程序&#xff0c;该应用程序涉及JAX-RS&#xff08;REST&#xff09;&#xff0c;WebSockets和CDI。 注意 &#xff1a;不想让它成为破坏者-但本文主要讨论我在尝试使用Web套接字和使用CDI作为“胶水”&#xff08;在Java EE应用程…

c语言排序方法有哪几种?

c语言排序方法有&#xff1a;1、简单选择排序&#xff0c;基于O&#xff08;n2&#xff09;时间复杂度的排序算法&#xff1b;2、冒泡排序&#xff1b;3、简单插入排序&#xff1b;4、希尔排序&#xff1b;5、归并排序&#xff0c;基于归并操作的一种排序算法&#xff1b;6、快…

java 类型不可视_jvm高级特性(5)(1)(原子性,可见性,有序性,volatile,概述)

简介&#xff1a;阿姆达尔定律(Amdahl)&#xff1a;该定律通过系统中并行化与串行化的比重来描述多处理器系统能获得的运算加速能力。摩尔定律(Moore)&#xff1a;该定律用于描述处理器晶体管数量与运行效率间的发展关系。当价格不变时&#xff0c;集成电路上可容纳的元器件的数…

工程模式和抽象工厂模式_功能工厂模式

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

c语言怎么输入3个数输出最大值

方法&#xff1a;首先使用scanf()接收从键盘输入的三个数&#xff1b;然后使用“if else”语句比较三个数的大小&#xff0c;获得最大值&#xff1b;最后使用print()函数将最大值输出即可。c语言输入3个数输出最大值#include int main() { // 输入abc输出最大值 int a; …

java调用ecdh_椭圆曲线ECC ECDH原理 javacard实现

椭圆曲线原理&#xff1a;椭圆曲线的图像并不是椭圆形&#xff0c;椭圆曲线源自于求椭圆弧长的椭圆积分的反函数。定义&#xff1a;椭圆曲线可用下列方程来表示&#xff0c;其中a,b,c,d为系数。E&#xff1a; y2 ax3 bx2 cx d椭圆曲线运算&#xff1a;(相当于交换群)AB&#x…

C 常用新特性(上)

下面是正文&#xff1a;auto类型推导auto可以让编译器在编译器就推导出变量的类型&#xff0c;看代码&#xff1a;利用auto可以通过右边的类型推导出变量的类型。什么时候使用auto呢&#xff1f;简单类型其实没必要使用auto&#xff0c;然而某些复杂类型就有必要使用auto&#…

等级保护测评工作重点难点_重点保护

等级保护测评工作重点难点在“ Java的一些句子 ”一文中&#xff0c;我写道&#xff1a; “受保护的方法和字段可以在同一包中的类中使用&#xff08;到目前为止与私有包相同&#xff09;&#xff0c;此外&#xff0c;还可以从其他类中使用受保护的方法和字段&#xff0c;这些类…

c编译程序是什么?

c编译程序是由计算机厂家提供的一套软件。c编译程序又称c语言编译器&#xff0c;是指用c语言书写的源程序&#xff0c;翻译成等价的机器语言格式目标程序的翻译程序。编译程序属于采用生成性实现途径实现的翻译程序。它以高级程序设计语言书写的源程序作为输入&#xff0c;而以…