javaio流层次结构

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

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

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

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

5.结论

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

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

javaio流层次结构

javaio流层次结构_流的多层次分组相关推荐

  1. io读取文件无地址_流的基本概念和IO流入门

    对于任何程序设计语言而言,输入输出(Input/Output)系统都是非常核心的功能.程序运行需要数据,数据的获取往往需要跟外部系统进行通信,外部系统可能是文件.数据库.其他程序.网络.IO设备等等. ...

  2. ca76a_c++_流文件打开输入输出文件模式

    /*ca76a_c++_流文件打开输入输出文件模式 利用文件流打开文件进行输入与输出时的选项 in.out.app(附加模式).ate((end)文件打开后,定于文件结尾).trunc(裁剪).bin ...

  3. 引流虚拟主机和服务器,2020微商引流客源_虚拟主机对SEO

    2020微商引流客源_虚拟主机对SEO 2021-03-05 | 阅读量: 2020微商引流客源_虚拟主机对SEO优化是否有影响!,虚拟主机,对,SEO,优化,是否,有影响,网,站上,的,, 网站上的 ...

  4. javaIO流之转换流

    目录 简介 一.编码和解码 二.字符集 2.1ASCII 字符集 2.2Unicode 字符集 2.3GBK 字符集 三.乱码 四.InputStreamReader 4.1构造方法 4.2解决编码问 ...

  5. .dat文件写入byte类型数组_文件字节流、文件字符流、缓冲字节流、缓冲字符流字节数组流、数据流、转换流、对象流...

    一.实操名称: 描述如下流的基本作用:文件字节流.文件字符流.缓冲字节流.缓冲字符流字节数组流.数据流.转换流.对象流二.描述1.文件字节流:包括:FileInputStream,FileOutput ...

  6. java byte char io流_吃透Java IO:字节流、字符流、缓冲流

    前言有人曾问fastjson的作者(阿里技术专家高铁):"你开发fastjson,没得到什么好处,反而挨了骂背了锅,这种事情你为什么要做呢?" 高铁答道:"因为热爱本身, ...

  7. feed流和瀑布流_产品PM必备的Feed流和瀑布流应用场景

    什么是Feed流,顾名思义,Feed是喂养的意思,你想吃什么,就喂给你什么,典型的例子就是微博.知乎的首页,以及各个聚合类资讯app的订阅号.这些信息的共同点就是给你喂你想看的,而不是将所有的东西全部 ...

  8. 核心频率个加速频率_流处理器、核心频率、 位宽……这些显卡参数你知道吗?—— 电脑硬件科普篇(八)...

    判断一张显卡的好坏,依然要使用参数 然而我认为显卡是不需要知道参数的 因为在知道性能差距的情况下,用相同分辨率下的游戏帧数进行对比就能选购自己的显卡 但是既然是科普,也就讲一讲吧 来自http://w ...

  9. 列表流和feed流_通过流而不是列表

    列表流和feed流 开幕式免责声明:这并不总是一个好主意. 我将介绍这个想法,以及为什么它是一个好主意的一些原因,但随后我将讨论一些不太理想的实例. 懒惰 如您所知,我在Python中的学习几乎和在J ...

最新文章

  1. php 自加 性能,对于数据库的自增、自减心得
  2. 打开sql server 验证
  3. Spring注解使用方法
  4. Composer update 问题: Could not authenticate against github.com
  5. chrome vue 未响应_VUE数据响应式
  6. 用于软件包管理的21个Linux YUM命令
  7. 王道 ——线程概念和多线程模型
  8. str split函数 php,怎么在php中利用str_split函数分割字符串
  9. gentoo Portage使用
  10. Web前端开发工程师基本要求
  11. 数字信号处理实验——语音信号的数字滤波
  12. 实现国标GB28181视频流媒服务平台EasyGBS-公安部国标35114(GB35114)A级检测说明
  13. SCAU高级语言程序设计--实验4 选择结构(3)
  14. 别花时间抠图了,赶紧试试这几个免抠图的PNG图片网站!
  15. python中一元二次方程的虚根_一元二次方程的概念和习题(老师用)
  16. 使用WinWedge软件记录satorius天平的数据(记录)
  17. 三丰云提供免费虚拟主机、免费云服务器”
  18. Python爬虫入门教程 40-100 博客园Python相关40W博客抓取 scrapy
  19. 和讯金融界证券之星 财经网站竞争格局突变
  20. 一台服务器,启动多个redis

热门文章

  1. 判断整除(opj)(动态规划)
  2. 倍增:喷泉 深度解析(洛谷P7167)
  3. 2021牛客暑期多校训练营3 B-Black and white(思维+最小生成树)
  4. codeforces1485 E. Move and Swap(dp)
  5. 纪中C组模拟赛总结(2019.7.9)
  6. MySQL max()函数
  7. Oracle入门(九A)之用户的权限或角色
  8. 尽力去帮助一个陌生人
  9. C++描述杭电OJ 2011.多项式求和 ||
  10. 干货!sqlserver数据库所有知识点总结整理,含代码(挺全的)