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

智能推荐

Proteus 8 Professional中的基本元器件_proteus 8 professional元器件对照表-程序员宅基地

文章浏览阅读1.4w次,点赞12次,收藏32次。英文名称中文名称图片BUTTON复位开关Resistors电阻crystal晶振_proteus 8 professional元器件对照表

【49】新版pciutils解决undefined reference to `udev_hwdb_get_properties_list_entry-程序员宅基地

文章浏览阅读1k次。gcc -o pcieinject ./pcietest_hypcie.c ./pcietest_parse.c ./pcietest_pcie.c ./pcietest_pcieaer.c smnlib/hygon_smn.c -O0 -g -Wall -D LITTLEENDIAN_CPU -I comlib -I pcilib -I smnlib -L ./pcilib/lib -Wl,-B..._pciutils

opentsdb-程序员宅基地

文章浏览阅读57次。为什么80%的码农都做不了架构师?>>> ...

java怎么访问私有类_如何从Java类的外部访问类的私有方法?-程序员宅基地

文章浏览阅读2.6k次。您可以使用java反射包访问类的私有方法。步骤1-通过传递声明为私有的方法的方法名称来实例化java.lang.reflect包的Method类。步骤2-通过将值true传递给setAccessible()方法来设置可访问方法。步骤3-最后,使用invoke()方法调用该方法。示例importjava.lang.reflect.Method;publicclassDemoTest{priv..._私有类型如何访问方法

mysql 6.3 入门_Mysql入门-程序员宅基地

文章浏览阅读224次。简介:数据库的操作:1.用 SHOW 显示已有的数据库show databases 2.创建数据库:create database 创建数据库create database db_name3.删除数据库:drop databse db_name4.use 选定数据库.use db_name 数据表的操作:1.show/de ...数据库的操作:1.用 SHOW 显示已有的数据库show datab..._mysql6.3

用opencv的aruco库生成二维码marker标记_树莓派opencv识别aruco二维码-程序员宅基地

文章浏览阅读1k次。用opencv的aruco库生成二维码marker标记代码来源于官方提供的完整的工作实例create_marker.cpp。在opencv源码中的位置为opencv_contrib-4.4.0/modules/aruco/samples/create_marker.cpp。#include <opencv2/highgui.hpp>#include <opencv2/aruco.hpp>#include <iostream>using namespace cv_树莓派opencv识别aruco二维码

随便推点

Python初探:turtle(海龟)实现动画_python turtle 动画-程序员宅基地

文章浏览阅读1.2w次,点赞17次,收藏88次。利用Python的turtle库实现一个动画Turtle库是Python内置的图形化模块,是绘制图像的函数库。海龟即屏幕上绘图的光标(小三角形),编写Python指令可以让海龟在屏幕上移动绘制线条,可将海龟看做是坐标系里移动,位置可用坐标表示(x,y)。基于turtle的动画,动画可以理解为由一张张快速切换而成:1、准备工作:设置speed为0(最快,不显示海龟动态);隐藏海龟——h..._python turtle 动画

vim ctrl+v块操作_vim ctrl v-程序员宅基地

文章浏览阅读3.1k次。linux vim块/整行操作快捷键_vim ctrl v

探秘ESP8266与React结合的智能硬件项目:GitCode上的[rjwats/esp8266-react](https://gitcode.com/rjwats/esp8266-react?ut...-程序员宅基地

文章浏览阅读360次,点赞3次,收藏6次。探秘ESP8266与React结合的智能硬件项目:GitCode上的rjwats/esp8266-react项目地址:https://gitcode.com/rjwats/esp8266-react项目简介在物联网(IoT)的世界中,ESP8266是一个著名的低成本、高性能的Wi-Fi微控制器,常被用于构建各种智能家居设备和DIY项目。而React作为前端开发的主流框架,以其组件化和虚拟DO...

arm64以及amd64和龙芯4000下安装pyqt:_generating the c++ source for the qtcore module...-程序员宅基地

文章浏览阅读3.4k次。arm64以及amd64和龙芯4000下安装pyqt:包下载地址:sip安装包地址:https://riverbankcomputing.com/software/sip/downloadqt源码下载 http://download.qt.io/arhive/qt/2.7下安装pyqt5:https://www.cnblogs.com/deeplearning1314/p/10671347.html参考编译链接:linux下安装qt:https://blog.csdn.net/u01452338_generating the c++ source for the qtcore module...error: unable to create th

Python Qt GUI设计:将UI文件转换为Python文件的三种妙招(基础篇—2)_pyqt ui转py-程序员宅基地

文章浏览阅读4.3w次,点赞35次,收藏150次。本篇博文讲讲 Qt Creator 使用方法,分享三种将UI界面文件编译为Python文件的方法。_pyqt ui转py

Bugku CTF-Web篇writeup 3-11_ctf 3-11-程序员宅基地

文章浏览阅读1.2k次,点赞4次,收藏6次。Flask_FileUpload由题目名得知的信息,显然是个文件上传的题目,flask:一种python的web框架首先Ctrl+U查看页面源代码,一般能看到题目提示支持jpg,png格式的文件上传,绿色的英文提示意思是上传文件,它会解析python代码并返回运行结果,所以上传php木马的并不能成功在txt文档中写一段py程序来调用系统命令导入 os模块 pyhon的os模块包含了普通的系统操作功能,这里os.system('')执行了ls命令因为上传有格式的限制,所以要重命_ctf 3-11

推荐文章

热门文章

相关标签