Java8流式API将实体类列表转换为视图对象列表的示例

 更新时间:2024年11月22日 10:42:36   作者:码农研究僧  
这篇文章主要介绍了Java8流式API将实体类列表转换为视图对象列表的示例,文中有相关的代码示例供大家参考,对大家的学习或工作有一定的帮助,需要的朋友可以参考下

从实战Demo进行学习:

1. 基本知识

这段代码是一个 Java 方法,将一个实体类列表 (List<E>) 转换为一个视图对象列表 (List<V>)

这里使用了 Java 8 的流 (Stream) API 来实现转换

public List<V> listVO(List<E> list) {
    return (List) list.stream()             // 1. 将输入的实体列表转换成流
            .map(this::entityVO)           // 2. 对每个实体元素应用 entityVO 方法进行转换
            .collect(Collectors.toList()); // 3. 将转换后的流收集成一个新的列表
}

相关的基本知识:

  • list.stream()
    list 是一个 List<E> 类型的输入参数,表示一组实体类对象 (E)
    stream() 方法将集合转为流(Stream),这是 Java 8 引入的流式处理 API,使得对集合的操作更加简洁和可读
  • .map(this::entityVO)
    map 方法是流操作之一,接受一个函数式接口(Function)
    这里使用了 this::entityVO,即调用当前对象的 entityVO 方法
    entityVO 方法将每个实体对象 (E) 转换成一个视图对象 (V)。假设 entityVO 方法的返回类型是 V。
  • .collect(Collectors.toList())
    collect 是流的终端操作之一,用于将流转换为某种集合
    在这里,Collectors.toList() 将流中的元素收集成一个新的 List<V>

总的来说,entityVO 方法的作用是将实体类对象 (E) 转换为视图对象 (V)
这个方法通常是开发者根据业务需求自行定义的
它可能只是从实体对象中提取必要的字段来构建一个简化的视图对象

2. Demo

使用了 Java 8 的流式处理 API,通过 map 方法将实体对象列表转换为视图对象列表。
这种方式常用于将数据库实体类转换为前端展示需要的简化视图对象,避免暴露敏感数据或不必要的字段

为更好的展示具体的使用逻辑,以测试Demo为例

基本目录如下:

完整Demo如下:

// 实体类
class Employee {
    private String name;
    private int age;
    private double salary;

    // 构造函数和 Getter/Setter
    public Employee(String name, int age, double salary) {
        this.name = name;
        this.age = age;
        this.salary = salary;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public double getSalary() {
        return salary;
    }
}

// 视图对象类
class EmployeeVO {
    private String name;
    private int age;

    // 构造函数和 Getter/Setter
    public EmployeeVO(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

// 转换方法所在的类
class EmployeeService {

    // 将 Employee 实体转换为 EmployeeVO 视图对象
    private EmployeeVO entityVO(Employee employee) {
        return new EmployeeVO(employee.getName(), employee.getAge());
    }

    // 将 Employee 列表转换为 EmployeeVO 列表
    public List<EmployeeVO> listVO(List<Employee> list) {
        return (List<EmployeeVO>) list.stream()  // 将 Employee 列表转为流
                .map(this::entityVO)            // 调用 entityVO 方法转换为 EmployeeVO
                .collect(Collectors.toList());  // 收集结果到一个 List
    }
}

// 使用示例
public class Demo {
    public static void main(String[] args) {
        List<Employee> employees = new ArrayList<>();
        employees.add(new Employee("Alice", 30, 50000));
        employees.add(new Employee("Bob", 25, 40000));

        EmployeeService service = new EmployeeService();
        List<EmployeeVO> employeeVOList = service.listVO(employees);

        // 输出 EmployeeVO 列表
        employeeVOList.forEach(vo -> System.out.println("Name: " + vo.getName() + ", Age: " + vo.getAge()));
    }
}

截图如下:

如果还看不懂,基本的代码解读如下:

  • Employee 类是实体类,包含了 name、age 和 salary 等字段,表示员工的详细信息
  • EmployeeVO 类是视图对象类,只包含 name 和 age 字段,适合用来展示在 UI 中,不包含敏感数据如 salary
  • entityVO 方法负责将 Employee 实体对象转换为 EmployeeVO 视图对象
    在这个例子中,entityVO 方法只提取了 name 和 age 字段
  • listVO 方法接受一个 List<Employee> 参数,使用 stream() 方法将其转化为流,然后通过 map(this::entityVO) 将每个 Employee 对象转换为 EmployeeVO 对象,最后使用 collect(Collectors.toList()) 将结果收集成一个新的 List<EmployeeVO>

3. 拓展

还有一种分页的转换实现:

通过Java 泛型实体类与视图对象分页转换的封装实现

pageVO 方法的目的是将分页的实体类对象 (IPage<E>) 转换为分页的视图对象 (IPage<V>),并保留分页的元信息(如当前页、每页大小、总记录数)。这种封装常用于服务层返回统一格式的分页数据

模版如下:

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.List;
import java.util.stream.Collectors;

public abstract class BaseEntityWrapper<E, V> {
    public BaseEntityWrapper() {
    }

    public abstract V entityVO(E entity);

    public List<V> listVO(List<E> list) {
        return (List)list.stream().map(this::entityVO).collect(Collectors.toList());
    }

    public IPage<V> pageVO(IPage<E> pages) {
	    // 1. 获取分页数据中的记录列表,并通过 listVO 方法将其从实体类转换为视图对象
	    List<V> records = this.listVO(pages.getRecords());
	    
	    // 2. 创建新的分页对象,用于存储视图对象
	    IPage<V> pageVo = new Page<>(pages.getCurrent(), pages.getSize(), pages.getTotal());
	    
	    // 3. 将转换后的视图对象列表设置到新的分页对象中
	    pageVo.setRecords(records);
	    
	    // 4. 返回包含视图对象的分页结果
	    return pageVo;
	}

}

示例Demo如下:

// 实体类
class Employee {
    private Long id;
    private String name;
    private double salary;

    // 构造函数、Getter、Setter
    public Employee(Long id, String name, double salary) {
        this.id = id;
        this.name = name;
        this.salary = salary;
    }
    public Long getId() { return id; }
    public String getName() { return name; }
    public double getSalary() { return salary; }
}

// 视图对象类
class EmployeeVO {
    private Long id;
    private String name;

    // 构造函数、Getter、Setter
    public EmployeeVO(Long id, String name) {
        this.id = id;
        this.name = name;
    }
    public Long getId() { return id; }
    public String getName() { return name; }
}

自定义 Wrapper 实现

public class EmployeeWrapper extends BaseEntityWrapper<Employee, EmployeeVO> {

    // 实现抽象方法:将 Employee 转换为 EmployeeVO
    @Override
    public EmployeeVO entityVO(Employee employee) {
        return new EmployeeVO(employee.getId(), employee.getName());
    }
}

使用的示例如下:

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.util.ArrayList;
import java.util.List;

public class Demo {
    public static void main(String[] args) {
        // 1. 创建模拟分页数据
        List<Employee> employees = new ArrayList<>();
        employees.add(new Employee(1L, "Alice", 50000));
        employees.add(new Employee(2L, "Bob", 40000));
        IPage<Employee> employeePage = new Page<>(1, 10, 20); // 当前第1页,每页10条,总共20条
        employeePage.setRecords(employees);

        // 2. 使用 EmployeeWrapper 进行转换
        EmployeeWrapper wrapper = new EmployeeWrapper();
        IPage<EmployeeVO> employeeVOPage = wrapper.pageVO(employeePage);

        // 3. 输出转换后的分页结果
        System.out.println("分页元信息:");
        System.out.println("当前页:" + employeeVOPage.getCurrent());
        System.out.println("每页大小:" + employeeVOPage.getSize());
        System.out.println("总记录数:" + employeeVOPage.getTotal());

        System.out.println("\n分页记录:");
        employeeVOPage.getRecords().forEach(vo -> 
            System.out.println("ID: " + vo.getId() + ", Name: " + vo.getName())
        );
    }
}

类似输出如下:

分页元信息:
当前页:1
每页大小:10
总记录数:20
分页记录:
ID: 1, Name: Alice
ID: 2, Name: Bob

以上就是Java8流式API将实体类列表转换为视图对象列表的示例的详细内容,更多关于Java8 API实体类列表转视图列表的资料请关注脚本之家其它相关文章!

相关文章

  • Maven本地仓库的配置以及修改默认.m2仓库位置

    Maven本地仓库的配置以及修改默认.m2仓库位置

    今天小编就为大家分享一篇关于Maven本地仓库的配置以及修改默认.m2仓库位置的文章,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-10-10
  • SpringBoot整合SpringCloud的过程详解

    SpringBoot整合SpringCloud的过程详解

    SpringCloud专注于为典型的用例和扩展机制提供良好的开箱即用体验,在介绍SpringCloud默认使用的注册中心前,先给大家介绍下分布式系统的三个指标,具体内容详情跟随小编一起看看吧
    2021-09-09
  • 使用Nacos实现动态路由的步骤和代码示例

    使用Nacos实现动态路由的步骤和代码示例

    这篇文章主要介绍了使用 Nacos 实现 Spring Cloud Gateway 的动态路由,本文给大家介绍了具体的实现步骤和代码案例,感兴趣的小伙伴跟着小编一起来看看吧
    2024-09-09
  • 浅谈Java的WeakHashMap源码

    浅谈Java的WeakHashMap源码

    这篇文章主要介绍了浅谈Java的WeakHashMap源码,WeakHashMap,从名字可以看出它是某种 Map,它的特殊之处在于 WeakHashMap 里的entry可能会被GC自动删除,即使程序员没有调用remove()或者clear()方法,需要的朋友可以参考下
    2023-09-09
  • 深入理解Java设计模式之组合模式

    深入理解Java设计模式之组合模式

    这篇文章主要介绍了JAVA设计模式之组合模式的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下
    2021-11-11
  • java实现留言板功能实例

    java实现留言板功能实例

    这篇文章主要为大家详细介绍了JSP+JavaBean的留言板技术 ,JavaWeb登陆功能实现代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • SpringBoot增量/瘦身部署jar包的方式

    SpringBoot增量/瘦身部署jar包的方式

    SpringBoot 项目的部署一般采用全量jar 包方式部署相关项目,如果我们对相关的Contrller层进行相关业务调整就需要重新编译全量jar 包太麻烦了,所以本文给大家介绍了使用SpringBoot 的增量/瘦身部署方式,需要的朋友可以参考下
    2024-01-01
  • java中Date类和Strng类的灵活转化

    java中Date类和Strng类的灵活转化

    这篇文章主要介绍了java中Date类和Strng类的灵活转化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • 详解基于redis实现分布式锁

    详解基于redis实现分布式锁

    系统的不断扩大,分布式锁是最基本的保障。与单机的多线程不一样的是,分布式跨多个机器。线程的共享变量无法跨机器。本文将介绍基于redis实现分布式锁。
    2021-06-06
  • Java用自定义的类作为HashMap的key值实例

    Java用自定义的类作为HashMap的key值实例

    下面小编就为大家带来一篇Java用自定义的类作为HashMap的key值实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12

最新评论