流的多层次分组

1.简介

使用Java 8流,可以很容易地根据不同的标准对对象集合进行分组。 在这篇文章中,我们将看到如何从简单的单级分组到更复杂的,涉及多个级分组的分组。

我们将使用两个类来表示我们要分组的对象:人和宠物。

人类

public class Person {private final String name;private final String country;private final String city;private final Pet pet;public Person(String name, String country, String city, Pet pet) {this.name = name;this.country = country;this.city = city;this.pet = pet;}public String getName() {return name;}public String getCountry() {return country;}public String getCity() {return city;}public Pet getPet() {return pet;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", country='" + country + '\'' +", city='" + city + '\'' +'}';}
}

宠物课

public class Pet {private final String name;private final int age;public Pet(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public int getAge() {return age;}@Overridepublic String toString() {return "Pet{" +"name='" + name + '\'' +", age=" + age +'}';}
}

在主要方法中,我们创建将在以下各节中使用的集合。

public static void main(String[] args) {Person person1 = new Person("John", "USA", "NYC", new Pet("Max", 5));Person person2 = new Person("Steve", "UK", "London", new Pet("Lucy", 8));Person person3 = new Person("Anna", "USA", "NYC", new Pet("Buddy", 12));Person person4 = new Person("Mike", "USA", "Chicago", new Pet("Duke", 10));List<Person> persons = Arrays.asList(person1, person2, person3, person4);
  • 您可以在此处查看源代码。

2.单层分组

最简单的分组形式是单级分组。 在此示例中,我们将按其国家/地区对集合中的所有人员进行分组:

public void singleLevelGrouping(List<Person> persons) {final Map<String, List<Person>> personsByCountry = persons.stream().collect(groupingBy(Person::getCountry));System.out.println("Persons in USA: " + personsByCountry.get("USA"));
}

如果我们查看地图,就会看到每个国家如何包含其公民列表:

单组

结果显示居住在指定国家/地区的人:

Persons in USA: [Person{name='John', country='USA', city='New York'}, Person{name='Anna', country='USA', city='New York'}, Person{name='Mike', country='USA', city='Chicago'}]

3.两级分组

在此示例中,我们将不仅按国家/地区分组,还按城市分组。 为此,我们需要实现两级分组。 我们将按国家对人员进行分组,对于每个国家,我们将按其居住城市对人员进行分组。

为了允许多级分组,类Collectors中的groupingBy方法支持附加的Collector作为第二个参数:

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

让我们使用此方法来实现我们的两级分组:

public void twoLevelGrouping(List<Person> persons) {final Map<String, Map<String, List<Person>>> personsByCountryAndCity = persons.stream().collect(groupingBy(Person::getCountry,groupingBy(Person::getCity)));System.out.println("Persons living in London: " + personsByCountryAndCity.get("UK").get("London").size());
}

如果我们调试执行,我们将看到人员的分布情况:

twoLevelGrouping

4.三级分组

在最后一个示例中,我们将更进一步,并按国家/地区,城市和宠物的名字对人进行分组。 为了便于阅读,我将其分为两种方法:

public void threeLevelGrouping(List<Person> persons) {final Map<String, Map<String, Map<String, List<Person>>>> personsByCountryCityAndPetName = persons.stream().collect(groupingBy(Person::getCountry,groupByCityAndPetName()));System.out.println("Persons whose pet is named 'Max' and live in NY: " +personsByCountryCityAndPetName.get("USA").get("NYC").get("Max").size());
}private Collector<Person, ?, Map<String, Map<String, List<Person>>>> groupByCityAndPetName() {return groupingBy(Person::getCity, groupingBy(p -> p.getPet().getName()));
}

现在我们有了三个嵌套的地图,其中包含每个人员列表:

threeLevel分组

5.结论

Java 8 Collectors API为我们提供了一种对集合进行分组的简便方法。 通过嵌套收集器,我们可以添加不同的组层以实现多级分组。

翻译自: https://www.javacodegeeks.com/2016/03/multi-level-grouping-streams.html

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

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

相关文章

华为微型计算机b515,华为MateStation B515台式机曝光:五种配置

之前华为官网曾上架了台式机MateStation B515&#xff0c;这引起了很多网友的关注&#xff0c;不过实际情况是&#xff0c;它只是针对政企渠道&#xff0c;不过官方当时并没有给出新品的售价。从网友最新曝光的细节看&#xff0c;MateStation B515要比之前传闻的价格便宜不少&a…

冈仁波齐

昨日看了《冈仁波齐》&#xff0c;其实第一次听这部电影还是在网易云看到朴树的新歌《No Fear In My Heart》时知道有这样一部电影的&#xff1b; 抱着好奇心去看&#xff0c;发现这确实是一部不错的电影&#xff0c;具体好在哪里我也不是说得很清楚&#xff0c;只知道我在看电…

计算机图形相关输出设备,计算机图形输出设备.ppt

计算机图形输出设备第2章 计算机图形系统 2.1 计算机图形系统概述 2.2 基于Windows的图形程序开发方法 2.3 OpenGL介绍 2.1 计算机图形系统概述 2.1.1 计算机图形外部设备 新型显示器 计算机图形输入设备 计算机图形输出设备 2.1.2 计算机图形软件 几何造型平台 CAD/CAM 计算机…

Linux下用ls和du命令查看文件以及文件夹大小

ls的用法 ls -l |grep "^-"|wc -l或find ./company -type f | wc -l 查看某文件夹下文件的个数&#xff0c;包括子文件夹里的。 ls -lR|grep "^-"|wc -l 查看某文件夹下文件夹的个数&#xff0c;包括子文件夹里的。 ls -lR|grep "^d"|wc -l …

四川高职计算机二本线学校,全网首发!四川省本科二批次2019年对口高职投档录取线出炉...

原标题&#xff1a;全网首发&#xff01;四川省本科二批次2019年对口高职投档录取线出炉四川省2019年高校招生本科录取接近尾声&#xff0c;二本批次征集志愿于8月1日进行。与此同时&#xff0c;专科批相关录取工作也进入我们视野。四川省各高校2019年对口高职调档线我省高职院…

app engine_App Engine中的Google Services身份验证,第1部分

app engine这篇文章将说明如何构建一个简单的Google App Engine&#xff08;GAE&#xff09;Java应用程序&#xff0c;该应用程序可以针对Google进行身份验证&#xff0c;并利用Google的OAuth授权访问Google的API服务&#xff08;例如Google Docs&#xff09;。 此外&#xff0…

Angular最新教程-第六节编写响应式导航栏

这节课我们讲解如何使用bootstrap 4 编写响应式布局。 参考图我们还是参照Angular中文社区http://www.angularjs.cn/ 图中标注红色的部分&#xff0c;我自己不是很喜欢&#xff0c;所以做了一点小改动。 他这里也没有做响应式布局&#xff0c;所以样式就不抄他的&#xff0c…

使用Spring-Retry重试处理

只要软件组件相互通信&#xff0c;就有可能出现临时的自我纠正错误。 此类故障包括服务的暂时不可用&#xff0c;网络连接的暂时丢失或服务繁忙时出现的超时。 在这种情况下&#xff0c;适当的重试处理可以减少这些故障可能引起的问题。 在这篇文章中&#xff0c;我们将看到如…

计算机在智慧交通的应用论文,智能交通的毕业论文

智能交通的毕业论文智能运输系统的研究许多国家都投入了巨大的人力和物力,并成为继航空航天、军事领域之后高新技术应用最集中的领域。下面为大家分享了有关智能交通的论文&#xff0c;欢迎欣赏&#xff01;摘 要&#xff1a;八十年代以来&#xff0c;世界一些发达国家纷纷投入…

MySQL5.5安装教程

1、 官网下载mysql5.5 下载地址&#xff1a; http://dev.mysql.com/downloads/mysql/5.5.html#downloads 2、 安装mysql5.5 注意&#xff0c;安装之前&#xff0c;请关闭杀毒软件。 &#xff08;1&#xff09; 打开下载的mysql-5.5.53-winx64.msi &#xff08;2&#xff09; 点…

计算机软件硬件基础知识,计算机硬件基础_计算机软硬件基础知识都包括什么具体的内容...

计算机硬件基础怎么学过去有许多微型计算机原理的书&#xff0c;讲或的原理现在肯定还有这方面的书&#xff0c;但讲的是什么我就不知道了还有学学单片机也可以对计算机硬件原理有所了解还可看有关杂志&#xff0c;如《微型计算机》&#xff0c;刚开始可能许多文章都看不懂&…

php里的抽象类和接口

//实例化类产生对象。//class fenbi//{// //普通成员&#xff0c;属于对象// public $length "10cm";// //静态成员&#xff0c;静态变量&#xff0c;属于类。// public static $color;//// //普通方法可以调用静态成员// function hua(){// echo $this->l…

新疆计算机二级慨库,2020新疆维吾尔自治区计算机二级易考套餐:二级MS Office高级应用全程班(网课+题库+教材)...

&nbsp&nbsp[导读]:2020新疆维吾尔自治区计算机二级易考套餐&#xff1a;二级MS Office高级应用全程班(网课题库教材)&#xff0c;更多新疆等级考试易考套餐&#xff0c;请访问易考吧新疆等级考试栏目2020新疆维吾尔自治区计算机二级易考套餐&#xff1a;二级MS Office高…

hotspot jvm_在Hotspot JVM中跟踪过多的垃圾收集

hotspot jvm由于内存泄漏或其他内存问题&#xff0c;经常导致应用程序冻结&#xff0c;仅使垃圾收集器&#xff08;GC&#xff09;进程运行失败&#xff0c;试图释放一些空间。 直到看门狗&#xff08;或沮丧的管理员&#xff09;重新启动应用程序并且问题从未解决之前&#xf…

计算机上平方米的单位,word怎么写平方米 word中平方米的单位怎么打

1、以Word2010版本为例&#xff0c;在文档中输入了平方米的单位&#xff0c;但是数字2不在上方&#xff1b;2、首先选中数字2&#xff0c;然后点击页面上方的上标图标&#xff0c;如下图所示&#xff1b;3、点击上标图标后&#xff0c;就会发现数字2在字母的右上方了&#xff0…

Xamarin 2017.10.9更新

Xamarin 2017.10.9更新本次更新主要解决了一些bug。Visual Studio 2017升级到15.4获得新功能。Visual Studio 2015需要工具-选项-Xamarin进行更新&#xff0c;更新Xamarin插件到4.7.10.22 版本。工具包分享链接&#xff1a;http://pan.baidu.com/s/1dE5hnCP 密码&#xff1a;3k…

通过入侵JVM打印阵列

总览 Java中最常见的陷阱之一就是知道如何打印数组。 如果有关如何打印阵列的答案获得了超过1000票赞成票&#xff0c;那么您必须怀疑是否有更简单的方法。 几乎所有其他流行语言都具有这种更简单的方法&#xff0c;因此我不清楚Java为什么仍会这样做。 与其他JDK类不同&#…

一种同于计算机键盘的测试装置,一种计算机键盘按键测试装置

主权项&#xff1a;1.一种计算机键盘按键测试装置&#xff0c;包括顶架以及固定安装在顶架正下方的测试机&#xff0c;其特征在于&#xff1a;顶架底面与测试机顶面之间固定连接有连接架&#xff0c;测试机内设有敲打装置和除尘装置&#xff0c;敲打装置包括设置在测试机左侧底…

SQL Server 索引重建手册

注意&#xff1a;索引重建前建议把数据库切换为完整模式&#xff0c;否则索引复制会在数据文件中进行&#xff0c;导致数据文件很大&#xff0c;而数据文件的收缩比日志文件的收缩要困难的多&#xff0c;且会对业务造成影响。步骤一:查询索引碎片&#xff0c;脚本如下&#xff…

三角形面积计算机方法,数学知识点:三角形面积的计算

原标题&#xff1a;数学知识点&#xff1a;三角形面积的计算复习&#xff11;、说说长方形、平行四边形的面积计算公式。长方形的面积长宽平行四边形的面积底高2、 计算下面长方形和平行四边形的面积&#xff0e;生活中常见的三角形思考 :怎样应用所学的方法探究三角形的面积计…