Java 8 Collectors分组及Collectors.mapping使用案例-程序员宅基地

技术标签: lambda  java  stream  新手博客  后端  

Java 8 Collectors分组及Collectors.mapping使用案例

今天学习的考核中,导师给出了一个需求:

利用java8 lambdas语言特性处理如下java集合对象,
为了方便描述对象用json表示为[{id:1,name:null},{id:1,name:”liwei”},{id:2,name:”zhansan”},{id:2,name:”lisi”}]
期望处理后的集合对象为[{id:1,name:[liwei]},{id:2, name:[zhansan,lisi] }]

最开始拿到需求的时候想了很久都没做出来,使用Collectors分组时也只实现了对id或name的分组,并未考虑到对两个都进行分组。咨询了做了一年多开发的同学才帮我正确解答。

具体代码实现如下:

//创建Person实体类:
public class Person {
    
    private Integer id;
    private String name;

    public Person(Integer id) {
    
        this.id = id;
    }

    public Person() {
    
    }

    public Person(Integer id, String name) {
    
        this.id = id;
        this.name = name;
    }

    public Integer getId() {
    
        return id;
    }

    public void setId(Integer id) {
    
        this.id = id;
    }

    public String getName() {
    
        return name;
    }

    public void setName(String name) {
    
        this.name = name;
    }
}

创建接收处理后的对象类:

public class PersonV2s {
    
    private Integer id;
    private List<String> names;

    public PersonV2s(Integer id, List<String> names) {
    
        this.id = id;
        this.names = names;
    }

    public Integer getId() {
    
        return id;
    }

    public void setId(Integer id) {
    
        this.id = id;
    }

    public List<String> getNames() {
    
        return names;
    }

    public void setNames(List<String> names) {
    
        this.names = names;
    }
}

利用lambda进行数据处理

public class LambdaDemo2 {
    
    @Test
    public void test() {
    
        List<Person> personList = Arrays.asList(
                new Person(1),
                new Person(1, "liwei"),
                new Person(2, "zhansan"),
                new Person(2, "lisi")
        );
        final Map<Integer, List<String>> map
                = personList.stream().collect(Collectors.groupingBy(Person::getId, Collectors.mapping(Person::getName, Collectors.toList())));
        final List<PersonV2s> personV2ss
                = map.entrySet().stream().map(p -> new PersonV2s(p.getKey(), p.getValue().stream().filter(Objects::nonNull).collect(Collectors.toList()))).collect(Collectors.toList());
        System.out.println(personV2ss.toString());
    }

}

最主要开始不熟悉Collectors方法的使用,导致一直未实现。对于java 8 新出的强大的Stream API,极大的简便了开发。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42577263/article/details/121091496

智能推荐

国家税务总局全国增值税发票查验平台网站js逆向分析及全逆向算法还原_“http://inv—veri.chinatax.gov.cn/”-程序员宅基地

文章浏览阅读2.1w次,点赞2次,收藏22次。本文教程针对的事2021年7月2日时国税查验平台的js分析,其中版本号为V2.0.06_009。主要分析内容为key9和flwq39以及fplx这3个参数的算法,其中key9分为获取验证码阶段和查验阶段,算法有所区别,flwq39同理。教程开始:一、官方网址https://inv-veri.chinatax.gov.cn/index.html二、请求分析国税查验平台请求共分为2个,第一个请求获取验证码,第二个请求为输入验证码后查验数据并返回发票详细信息。第一步:安装证书基础:谷歌_“http://inv—veri.chinatax.gov.cn/”

ASM驱动安装与ASM盘建立_asm1166驱动-程序员宅基地

文章浏览阅读3.7k次。ASM驱动安装与ASM盘建立(一)(转自 求道的路上http://space.itpub.net/17203031/viewspace-692538)上一篇 / 下一篇 2011-04-14 20:53:33 / 个人分类:ASM查看( 207 ) / 评论( 3 ) / 评分( 3 / 0 ) 前段时间安装虚拟Linux上的ASM实例,中间反复了几次,不过_asm1166驱动

【Python】(较简单)使用scipy.io.loadmat读取.mat文件中的数据部分-程序员宅基地

文章浏览阅读4.1w次,点赞34次,收藏127次。Python使用Scipy库中的io.loadmat读取.mat文件,并获取数据部分读取方法很简单,只需要使用scipy.io库即可,Python代码入下:import scipy.io as sioyFile = 'y2.mat' #相对路径datay=sio.loadmat(yFile)print datay此时输出的datay是一个字典格式的输出,如下:{‘y’:..._io.loadmat

robotframework 入门 (一)安装、工具ride/pycharm、三种用例模式_pycharm ride-程序员宅基地

文章浏览阅读2.6k次。测试教程网(虫师)http://www.testclass.net/rf/(虫师)Robot Framework自动化测试 ---视频与教程免费分享  电子书下载 《robot framework 自动化测试》 上课视频分享《robot framework上课视频》 最新录制网易云课堂《robot framework自动化测试入门》 最..._pycharm ride

Unity接入高德定位sdk简单三步无需与安卓工程交互_高德地图 unity sdk-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏24次。欢迎加入Unity业内qq交流群:956187480qq扫描二维码加群源码,原工程下载地址:https://download.csdn.net/download/qq_37310110/10729281参考地址:https://blog.csdn.net/qq_37310110/article/details/83145193一:高德定位有效key的获取参考官方文档地址:获..._高德地图 unity sdk

groupby单字段分组_lambdaquery groupby-程序员宅基地

文章浏览阅读84次。人生不缺不堪回首的过去,也不缺自欺欺人的幻想,脚踏实地的做自己,做自己喜欢的自己。生活不会辜负你,辜负你的只有人心。_lambdaquery groupby

随便推点

固态继电器_state relay-程序员宅基地

文章浏览阅读355次。如果A点的电压小于M1的过零电压(即VA _state relay

Linux input子系统简述(Linux驱动开发篇)-程序员宅基地

文章浏览阅读2.2k次,点赞6次,收藏29次。1. 简介input 子系统就是管理输入的子系统,和pinctrl、gpio 子系统一样,都是 Linux 内核针对某一类设备而创建的框架。按键、鼠标、键盘、触摸屏等都属于输入设备,linux内核为此专门做了一个叫做input子系统的框架来处理输入事件。输入设备本质上还是字符设备,只是在此基础上套上了input框架,用户只需要负责上报输入事件,比如按键值、坐标等信息。对于驱动编写者而言不需要去关心应用层的事情,我们只需要按照要求上报这些输入事件即可为此input子系统分为 input驱动层、in_linux input子系统

Activiti7.0实战学习(七):流程定义信息之删除_activiti删除model表还要删除什么表-程序员宅基地

文章浏览阅读2.8k次。背景数据库中要有必要的数据信息。比如流程定义表,流程定义的部署,流程实例的启动。根据ID删除,根据的是act_ru_deployment表的id进行删除的。这个删除操作影响了哪些表中的数据记录呢?流程定义信息的删除,操作的是act_ru_deployment表。是因为我们部署流程定义的信息的时候,其实就是把bpmn中的数据写到数据库中而已。因此,它删除的时候,没有找act_ru_proc..._activiti删除model表还要删除什么表

Centos磁盘空间转移重新分配_centos重新分配磁盘空间-程序员宅基地

文章浏览阅读2.1k次,点赞4次,收藏19次。重新分配centos磁盘空间,将其中一个挂载点的空间分配给另一个挂载点_centos重新分配磁盘空间

POJ 3683 Priest John's Busiest Day (2 - SAT) - from lanshui_Yang-程序员宅基地

文章浏览阅读1k次。题目大意:一个城镇里只有一个牧师,在国庆节这一天,他要为 n 对夫妇的婚礼祷告,这 n 对夫妇婚礼的开始时间 s 、结束时间 e 和祷告时间 d 不尽相同,但是祷告只能在每个婚礼的开始或结束时进行(如一个婚礼的开始时间为s , 结束时间为 e , 那么祷告的时间就为 s ~ s + d 或 e - d ~ e)。问:这个牧师是否能为所有的婚礼祷告,如果能,则输出为每个婚礼祷告的开始时间和结束时间。

解决java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset.的错误_java.io.filenotfoundexception: java.io.filenotfoun-程序员宅基地

文章浏览阅读6.6k次,点赞7次,收藏38次。解决java.io.FileNotFoundException: java.io.FileNotFoundException: HADOOP_HOME and hadoop.home.dir are unset. -see https://wiki.apache.org/hadoop/WindowsProblems_java.io.filenotfoundexception: java.io.filenotfoundexception: hadoop_home an