添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
首页 > 软件编程 > java > Lambda Stream流合并

Java分析Lambda表达式Stream流合并分组内对象数据合并

作者:leo825...

Lambda表达式,基于Lambda所带来的函数式编程,又引入了一个全新的Stream概念,用于解决集合类库既有的弊端,Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑

之前写过《 Lambda使用——JDK8新特性 》,现在有一个分组合并的需求正好拿来小试牛刀。

数据出自许多接口数据,需要将几个接口数据根据省份id进行分组合并。举例说明:

A接口返回List里面有值的的字段为:provinceId、field1、field2、field3

B接口返回List里面有值的的字段为:provinceId、field4、field5、field6

C接口返回List里面有值的的字段为:provinceId、field7、field8、field9

最终实现的效果是返回一个最终的list,里面的每一个实体值是上面所有字段合并后的值(provinceId、field1、field2、field3、field4、field5、field6、field7、field8、field9)

本文用的是junit测试类

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.18</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-core</artifactId>
            <version>5.5.6</version>
        </dependency>
    </dependencies>

设计实体类

实体类包含了所有的字段

package com.leo;
import lombok.Data;
import java.io.Serializable;
@Data
public class TestObj implements Serializable {
    private static final long serialVersionUID = 1L;
    String provinceId;
    String field1;
    String field2;
    String field3;
    String field4;
    String field5;
    String field6;
    String field7;
    String field8;
    String field9;
     * 测试类
    @Test
    public void streamConcat2() {
        TestObj t0 = new TestObj();
        t0.setProvinceId("000");
        t0.setField1("1");
        t0.setField2("2");
        t0.setField3("3");
        TestObj t1 = new TestObj();
        t1.setProvinceId("100");
        t1.setField1("1");
        t1.setField2("2");
        t1.setField3("3");
        TestObj t2 = new TestObj();
        t2.setProvinceId("100");
        t2.setField4("4");
        t2.setField5("5");
        t2.setField6("6");
        TestObj t3 = new TestObj();
        t3.setProvinceId("100");
        t3.setField7("7");
        t3.setField8("8");
        t3.setField9("9");
        TestObj t4 = new TestObj();
        t4.setProvinceId("102");
        t4.setField7("7");
        t4.setField8("8");
        t4.setField9("9");
        List<TestObj> list1 = new ArrayList<>();
        list1.add(t0);
        list1.add(t1);
        List<TestObj> list2 = new ArrayList<>();
        list2.add(t2);
        List<TestObj> list3 = new ArrayList<>();
        list3.add(t3);
        list3.add(t4);
        // 根据省份id进行分组,将同一个省的不同字段合并成一条数据对象
        List<TestObj> list = Stream.concat(Stream.concat(list1.stream(), list2.stream()), list3.stream())
                .filter(e -> e != null)
                .collect(Collectors.toMap(TestObj::getProvinceId, a -> a, (o1, o2) -> {
                    try {
                        // Hutool 的属性拷贝,最后一个参数是设置为null的字段不拷贝
                        BeanUtil.copyProperties(o1, o2, CopyOptions.create().setIgnoreNullValue(true).setIgnoreError(true));
                    } catch (Exception e) {
                        e.printStackTrace();
                    return o2;
                })).values().stream().collect(Collectors.toList());
        // 打印数据
        list.stream().forEach(System.out::println);

测试结果:

TestObj(provinceId=000, field1=1, field2=2, field3=3, field4=null, field5=null, field6=null, field7=null, field8=null, field9=null)
TestObj(provinceId=100, field1=1, field2=2, field3=3, field4=4, field5=5, field6=6, field7=7, field8=8, field9=9)
TestObj(provinceId=102, field1=null, field2=null, field3=null, field4=null, field5=null, field6=null, field7=7, field8=8, field9=9)

以每个省id作为进行数据分组,一个省只有一行数据,将其他有值的字段合并到这一行数据上

到此这篇关于Java分析Lambda表达式Stream流合并分组内对象数据合并的文章就介绍到这了,更多相关Lambda Stream流合并内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
  • 基于SpringBoot和Vue3的博客平台发布、编辑、删除文章功能实现
    基于SpringBoot和Vue3的博客平台发布、编辑、删除文章功能实现
    2023-04-04
  • 详解Java异常处理的使用与思考
    详解Java异常处理的使用与思考
    2023-04-04
  • springboot项目中全局设置用UTC+8
    springboot项目中全局设置用UTC+8
    2023-04-04
  • Java中transient关键字的详细总结
    Java中transient关键字的详细总结
    2023-04-04
  • 必须掌握的十个Lambda表达式简化代码提高生产力
    必须掌握的十个Lambda表达式简化代码提高生产力
    2023-04-04
  • Java如何实现判断并输出文件大小
    Java如何实现判断并输出文件大小
    2023-04-04
  • 你什么是Elastic Stack(ELK)
    你什么是Elastic Stack(ELK)
    2023-04-04
  • 命令行编译java文件方式
    命令行编译java文件方式
    2023-04-04
  • 美国设下计谋,用娘炮文化重塑日本,已影响至中国
    美国设下计谋,用娘炮文化重塑日本,已影响至中国
    2021-11-19
  • 时空伴随者是什么意思?时空伴随者介绍
    时空伴随者是什么意思?时空伴随者介绍
    2021-11-09
  • 工信部称网盘企业免费用户最低速率应满足基本下载需求,天翼云盘回应:坚决支持,始终
    工信部称网盘企业免费用户最低速率应满足基本下载需求,天翼云盘回应:坚决支持,始终
    2021-11-05
  • 2022年放假安排出炉:五一连休5天 2022年所有节日一览表
    2022年放假安排出炉:五一连休5天 2022年所有节日一览表
    2021-10-26
  • 电脑版 - 返回首页

    2006-2024 脚本之家 JB51.Net , All Rights Reserved.
    苏ICP备14036222号