Lambda使用——Stream流合并、分组内对象数据合并

导读:本篇文章讲解 Lambda使用——Stream流合并、分组内对象数据合并,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

前言

之前写过《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作为进行数据分组,一个省只有一行数据,将其他有值的字段合并到这一行数据上

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/72592.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!