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

目录
  • 前言
  • 需求
  • 代码实现
    • 依赖引入
    • 设计实体类
    • 测试代码

前言

之前写过《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流合并内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java8中Lambda表达式使用和Stream API详解

    前言 Java8 的新特性:Lambda表达式.强大的 Stream API.全新时间日期 API.ConcurrentHashMap.MetaSpace.总得来说,Java8 的新特性使 Java 的运行速度更快.代码更少.便于并行.最大化减少空指针异常. 0x00. 前置数据 private List<People> peoples = null; @BeforeEach void before () { peoples = new ArrayList<>(); peoples

  • 吊打Java面试官之Lambda表达式 Stream API

    目录 一.jdk8新特性简介 二.Lambda表达式 简单理解一下Lambda表达式 Lambda表达式的使用 三.函数式接口 1.什么是函数式接口 2.如何理解函数式接口 3.Java内置四大核心函数式接口 四.方法引用与构造器引用 方法引用 构造器引用和数组引用 五.Stream API 1.Stream API的说明 2.为什么要使用Stream API 3.创建Stream的四种方式 4.Stream的中间操作及其测试 5.Stream的终止操作及其测试 六.Optional类的使用 O

  • Java中的lambda和stream实现排序

    目录 前言 1.定义一个基础类 2.使用Comparator排序 3.使用lambda排序 4.使用Comparator的comparing方法排序 5.自定义比对方法 6.使用stream排序 7.null值判断 前言 在日常开发中,对数据排序是非常常见的一种需求,一般通过如下两种方式: 存储系统:通过SQL.NoSQL的排序功能,查询的结果是完成排序的结果: 内存:通过在内存中进行排序,查询的结果是无序的结果: 下面聊聊通过Java中的lambda和stream实现在内存中对数据进行排序.

  • Java详细分析Lambda表达式与Stream流的使用方法

    目录 Lambda Stream流 Lambda Lambda 表达式是一个匿名函数,我们可以把 lambda 表达式理解为一段可以传递的代码(将代码段像数据一样传递).使用它可以写出更简洁, 更灵活的代码.作为一种更紧凑的代码风格,使 java 语言的表达式能力得到的提升. 我们可以知道, Lambda表达式是为简化语法而存在的 ArrayList<String> list = new ArrayList<>(); list.add("a"); list.ad

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

    目录 前言 需求 代码实现 依赖引入 设计实体类 测试代码 前言 之前写过<Lambda使用——JDK8新特性>,现在有一个分组合并的需求正好拿来小试牛刀. 需求 数据出自许多接口数据,需要将几个接口数据根据省份id进行分组合并.举例说明: A接口返回List里面有值的的字段为:provinceId.field1.field2.field3 B接口返回List里面有值的的字段为:provinceId.field4.field5.field6 C接口返回List里面有值的的字段为:provinc

  • java jdk1.8 使用stream流进行list 分组归类操作

    我就废话不多说了,大家还是直接看代码吧~ import com.alibaba.fastjson.JSON; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; /** * @author czw */ public class Foo{ private String name; private String type; private Double typeValue; p

  • java中lambda表达式的分析与具体用法

    Lamda表达式 λ 希腊字母表中排序第十一位字母,英语名称为Lambda 避免匿名内部类定义过多 其实质属于函数式 编程的概念 (params)->expression[表达式] (params)->statement[语句] (params)->{statements} (a-> System.out.print("i like lambda–>"+a)); new Thread (()->System.out.println("多线程

  • Java中Lambda表达式并行与组合行为

    从串行到并行 串行指一个步骤一个步骤地处理,也就是通常情况下,代码一行一行地执行. 如果将我们常用的迭代器式的循环展开的话,就是串行执行了循环体内所定义的操作: sum += arr.get(0); sum += arr.get(1); sum += arr.get(2); //... 在书的一开始,就提到Java需要支持集合的并行计算(而Lambda为这个需求提供了可能). 这些功能将全部被实现于库代码中,对于我们使用者,实现并行的复杂性被大大降低(最低程度上只需要调用相关方法). 另外,关于

  • java中lambda表达式简单用例

    我对java中lambda表达式的看法是相当纠结的: 一个我这么想:lambda表达式降低了java程序的阅读体验.java程序一直不以表现力出众,正相反使Java流行的一个因素正是它的安全和保守--即使是初学者只要注意些也能写出健壮且容易维护的代码来.lambda表达式对开发人员的要求相对来说高了一层,因此也增加了一些维护难度. 另一个我这么想:作为一个码代码的,有必要学习并接受语言的新特性.如果只是因为它的阅读体验差就放弃它在表现力方面的长处,那么即使是三目表达式也有人觉得理解起来困难呢.语

  • 使用Java 8 Lambda表达式将实体映射到DTO的操作

    当我们需要将DTO转换为实体(Hibernate实体等)并向后转换时,我们都会面临混乱的开销代码. 在我的示例中,我将用Java 8演示代码如何变得越来越短. 让我们创建目标DTO: public class ActiveUserListDTO { public ActiveUserListDTO() { } public ActiveUserListDTO(UserEntity userEntity) { this.username = userEntity.getUsername(); ..

  • Java 中如何使用 stream 流

    目录 前言 一.筛选和切片 1.1.筛选 filter 1.2.去重 distinct 1.3.切片 limit 1.4.跳过元素 skip 1.5.排序 sorted 1.6.小结与综合应用 二.映射 map 三.查找和匹配 3.1.匹配 anyMatch.allMatch和noneMatch 方法 3.2.查找 findAny 与 findFirst 3.3.小结 四.归约 4.1.元素求和 reduce 后记 前言 如果你了解过 Liunx ,了解过 Liunx 的中管道命令 | ,那么你

  • Java 8 lambda表达式引入详解及实例

    Java 8 lambda表达式引入详解及实例 eclipse 下载安装 Help -> EclipseMarketplace -> 搜索Java 8 Kepler ->Java 8 support for eclipse Kepler SR2 安装完成后需要重启 Android Studio 在project的build.gradle文件中添加 buildscript { dependencies { classpath 'me.tatarka:gradle-retrolambda:3

  • Java中Lambda表达式之Lambda语法与作用域解析

    接上一篇:初探Lambda表达式/Java多核编程[2]并行与组合行为 本节是第二章开篇,前一章已经浅显地将所有新概念点到,书中剩下的部分将对这些概念做一个基础知识的补充与深入探讨实践. 本章将介绍Lambda表达式基础知识. 前言 把上一张书中的结语放到这里作为本章学习内容的开头,以此来概括Lambda表达式的优点: 提升性能.自动的并行化 更棒的API(comparing(...)细粒度的方法将成为标准) 编码风格得到改进.代码简化 反观前面几篇文章中的代码实践,以上三个优点全部得到了验证.

随机推荐