java list 自定义类型转换_使用Java Stream API将List按自定义分组规则转换成Map的一个例子...

本文完整测试代码见文末。

测试数据是List里的4个员工对象实例:

9d4bc12f51bfc5c6dfbb074dd83454f8.png

根据员工所在的城市进行分组:

05226dcd247e71a061a26e2bc0ba1096.png

结果分成了三组:

第一组的员工在上海:

de822e9c1f0024d08991c64e70acf8c5.png

第二组的员工在成都:

1321635bc213789592c1c0e81cb4c652.png

统计每组员工个数:

f9ac8cfc6d8ea66417a8b408fa79e121.png

4d7820d4620ee58ee922671fb1fcc007.png

把员工进行分组,得分大于101分的在一组,小于等于101的在另一组:

fafafd7e33b874c5cd7a03b258bfc77c.png

分组结果:

e9e7194163ce51540f5afc0bdba1ff91.png

4174aed2a58dece5c71aa1248b48c109.png

package java8;

import java.util.ArrayList;

import java.util.List;

import java.util.Map;

import java.util.Map.Entry;

import java.util.function.Consumer;

import java.util.stream.Collectors;

class Employee {

private String city;

private String name;

private int score;

public Employee(String name, String city, int score){

this.city = city;

this.name = name;

this.score = score;

}

public String getCity(){

System.out.println("city: " + this.city);

return this.city;

}

public String getName() {

return this.name;

}

public int getScore() {

return this.score;

}

@Override

public String toString() {

return String.format("Employee: " + this.name + " city: " + this.city);

}

}

class Person {

private String name;

private int age;

Person(String name, int age) {

this.name = name;

this.age = age;

}

@Override

public String toString() {

return String.format("Person{name='%s', age=%d}", name, age);

}

}

// Jerry 2016-01-15 20:51PM ? 多用于extends generic的type,接受所有Object的sub class

public class StreamTest {

private static void printMap(Map extends Object, ? extends Object> map) {

for(Entry extends Object, ? extends Object> entry:map.entrySet()) {

System.out.println("key = " + entry.getKey() + " , Value = " + entry.getValue());

}

}

public static void main(String[] args) {

ArrayList employees = new ArrayList();

employees.add(new Employee("A", "Shanghai",100));

employees.add(new Employee("B", "Chengdu",101));

employees.add(new Employee("C", "Shenzhen",102));

employees.add(new Employee("D", "Chengdu",104));

// group by City

Map> employeesByCity =

employees.stream().collect( Collectors.groupingBy(Employee::getCity));

// default void forEach(Consumer super T> action) {

for(Map.Entry> entry:employeesByCity.entrySet()) {

System.out.println("key= " + entry.getKey() + " , Value = " + entry.getValue());

entry.getValue().forEach(System.out::println);

}

// 2016-01-15 20:37PM

Consumer aa = a -> { System.out.println("Employee: " + a.getName() + " : " + a.getScore()); };

List chengduEmployee = employeesByCity.get("Chengdu");

chengduEmployee.forEach(aa);

// test for counting

Map employeesByCity2 =

employees.stream().collect( Collectors.groupingBy(Employee::getCity, Collectors.counting()));

printMap(employeesByCity2);

// calculate average score

Map employeesByCity3 =

employees.stream().collect( Collectors.groupingBy(Employee::getCity,

Collectors.averagingInt(Employee::getScore)));

printMap(employeesByCity3);

/*Stream people = Stream.of(new Person("Paul", 24), new Person("Mark", 30), new Person("Will", 28));

Map> peopleByAge = people.collect(groupingBy(p -> p.age, mapping((Person p) -> p.name, toList())));

System.out.println(peopleByAge);*/

/*

* 分区是一种特殊的分组,结果 map 至少包含两个不同的分组——一个true,一个false。

* 例如,如果想找出最优秀的员工,你可以将所有雇员分为两组,一组销售量大于 N,

* 另一组小于 N,使用 partitioningBy 收集器:

*/

System.out.println("partition result");

Map> partitioned =

employees.stream().collect(Collectors.partitioningBy(e -> e.getScore() > 101));

printMap(partitioned);

/*

* 你也可以将 groupingBy 收集器传递给 partitioningBy 收集器来将联合使用分区和分组。例如,你可以统计每个分区中的每个城市的雇员人数:

Map> result =

employees.stream().collect(partitioningBy(e -> e.getNumSales() > 150,

groupingBy(Employee::getCity, counting())));

这样会生成一个二级 Map:

{false={London=1}, true={New York=1, Hong Kong=1, London=1}}

*/

}

}

要获取更多Jerry的原创文章,请关注公众号"汪子熙":

b0dc89a8778f8f42f17da2081659998f.png

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

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

相关文章

安卓app与阿里云服务器的无线通信(非局域网)

参考:安卓app与阿里云服务器的无线通信(非局域网) 作者:图触靓 发布时间: 2020-08-01 16:13:14 网址:https://blog.csdn.net/bhbhhyg/article/details/107732156 目录写在阿里云里面的服务器代码&#xff1…

10.继承和派生

2019独角兽企业重金招聘Python工程师标准>>> 类成员访问权限: 成员访问权限:私有成员:只能被类自身的成员和友元访问; 公有成员:可以被任何普通函数和任何类的成员函数或子类访问; 保护成员&a…

树莓派与阿里云服务器之间的无线通信(非局域网)

参考:Linux虚拟机sqlite数据库安装教程 作者:图触靓 发布时间: 2020-08-01 15:45:026 网址:https://blog.csdn.net/bhbhhyg/article/details/107731166 购买服务器后。我们可以点击控制台,找到实例列表,点击…

业余剪辑——从拍摄到剪辑到加字幕

工作需要帮公司做一个公司的宣传片,要求不是很高所以就让我这个半吊子“设计”来做视频了。。。 以下设备和软件的使用只是我个人本次的使用的记录,大家按需使用即可 一、拍摄 设备:手机 软件:剪辑大师app(应用商店下载…

树莓派作为客户端与WemosD1作为服务器的无线通信(局域网通信)

参考:树莓派作为客户端与WemosD1作为服务器的无线通信(局域网通信) 作者:图触靓 发布时间: 2020-07-26 21:50:39 网址:https://blog.csdn.net/bhbhhyg/article/details/107599915 目录wemos版作为服务端代码…

Lync Server的环境搭建(五):Lync-Server的安装部署

今天,我们接着来进行Lync-Server服务端的安装。我们分别打开“Lync-DC”和“Lync-Server”这两台虚拟机,切换到“Lync-Server”下,“开始”—“Lync Server安装部署,单击“安装或更新Lync Server系统”。弹出”部署向导“窗口,我们…

NodeMan介绍

近年来,随着nodejs的突飞猛进,node项目数量增长迅猛,node项目完美的阐释了“开箱即用”的理念。小到创业公司,大到阿里这样的巨头,背后均有node的身影。 node项目基于Chrome的V8引擎,使用JavaScript&#x…

#ifndef, #define, #endif的作用

目录作用示例作用 #ifndef 它是if not define 的简写,是宏定义的一种,实际上确切的说,这应该是预处理功能三种(宏定义、文件包含、条件编译)中的一种——条件编译。 在c语言中,对同一个变量或者函数进行…

高性能的MySQL(2)慢查询

一、剖析MySQL查询1、首先从慢查询开始,慢查询是开销最低,精度最高的测量查询时间的工具。a、开始mysql的慢查询,修改my.conf[mysqld] #开启慢查询 log_slow_queries ON #指定日志文件存放位置,可以为空,系统会给一个…

python爬虫获取小说根据正文调用函数传入章节地址列表_python爬虫之小说章节获取,聊斋志异小说完整版...

“写鬼写妖高人一等,刺贪刺虐入骨三分。”没找到聊斋志异完整版的txt文档,那就把在线阅读的文章抓下来吧。开发环境python3.7requests模块lxml模块获取分析找到聊斋志异的小说网站。通过查看源码与分析小说每一章的URL链接发现,构成每一章的U…

程序运行时对应的内存分布(BSS段、数据段、代码段、堆、栈)关系

参考:程序运行时对应的内存分布关系 作者:嵌入式基地(公众号) 发布时间: 2021-04-28 网址:https://mp.weixin.qq.com/s/AVDPZawSjg9HtxEm8vsFBA 参考:静态变量与动态变量的定义与区别 作者&…

java线程池 锁_java多线程——锁

这是多线程系列第四篇,其他请关注以下:如果你看过前面几篇关于线程的文字,会对线程的实现原理了然于胸,有了理论的支持会对实践有更好的指导,那么本篇会偏重于线程的实践,对线程的几种应用做个简要的介绍。…

Ubuntu时间显示不准确的解决方案

参考:解决ubuntu里面时间不正确的办法 作者:三速何时sub20 发布时间:2020-12-08 16:24:27 网址:https://blog.csdn.net/weixin_44234294/article/details/110875899?spm1001.2014.3001.5501 目录1、进入终端2、输入命令3、选择 A…

Ubuntu下软件的安装、卸载方法

参考:Ubuntu 如何使用命令卸载安装过的软件(超级简单) 作者:一只青木呀 发布时间:2020-08-04 09:19:01 网址:https://blog.csdn.net/weixin_45309916/article/details/107778981 参考:Ubuntu下软…

Ubuntu文件压缩、解压缩、打包解包(带软链接)、拷贝文件(带软链接)、拷贝文件夹

参考:Ubuntu 命令解压文件大全 作者:一只青木呀 发布时间: 2020-08-04 17:18:55 网址:https://blog.csdn.net/weixin_45309916/article/details/107791294 参考:打包和压缩的概念和区别 作者:不浪漫的罪名L…

Ubuntu开启FTP服务方法(Ubuntu和Windows之间互传文件需要开启——服务器端)

目录Ubuntu开启FTP服务步骤:Ubuntu开启FTP服务步骤: 工作中Ubuntu和Windows之间互传文件,需要服务器端(Ubuntu)开启FTP服务,客户端(Windows)安装FileZilla。平时自己学习电脑安装虚拟…

win7共享wifi

为什么80%的码农都做不了架构师?>>> 1.从开始菜单找到“命令提示符”,或直接键入cmd快速搜索,右键单击它,选择“以管理员身份运行” 2.运行以下命令启用虚拟无线网卡: netsh wlan set hostednetwork mod…

Ubuntu开启NFS、SSH服务(驱动开发用到、电脑端登录ARM板用到)

参考:Ubuntu下NFS服务的开启 作者:一只青木呀 发布时间:2020-08-04 14:06:58 网址:https://blog.csdn.net/weixin_45309916/article/details/107784877 目录NFS服务的开启1.安装NFS服务2.创建 linux 工作目录3.配置NFSUbuntu下SSH…

【整理】MySQL 之 autocommit

2019独角兽企业重金招聘Python工程师标准>>> mysql 默认是开启 auto commit 的。可以通过如下命令查看 session 级别和 global 级别的设置: mysql> select session.autocommit; ---------------------- | session.autocommit | ---------------------…

交叉编译链的安装

参考:嵌入式 交叉编译链的安装 作者:一只青木呀 发布时间:2020-08-04 18:13:13 网址:https://blog.csdn.net/weixin_45309916/article/details/107789879 目录什么是交叉编译器交叉编译器的下载交叉编译器的安装1.把下载的文件放到…