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

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

从实战Demo进行学习:

1. 基本知识

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

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

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

相关的基本知识:

  • list.stream()
    list 是一个 List 类型的输入参数,表示一组实体类对象 (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

总的来说,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 listVO(List list) {
        return (List) list.stream()  // 将 Employee 列表转为流
                .map(this::entityVO)            // 调用 entityVO 方法转换为 EmployeeVO
                .collect(Collectors.toList());  // 收集结果到一个 List
    }
}

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

        EmployeeService service = new EmployeeService();
        List 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 参数,使用 stream() 方法将其转化为流,然后通过 map(this::entityVO) 将每个 Employee 对象转换为 EmployeeVO 对象,最后使用 collect(Collectors.toList()) 将结果收集成一个新的 List

3. 拓展

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

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

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

模版如下:

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 {
    public BaseEntityWrapper() {
    }

    public abstract V entityVO(E entity);

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

    public IPage pageVO(IPage pages) {
	    // 1. 获取分页数据中的记录列表,并通过 listVO 方法将其从实体类转换为视图对象
	    List records = this.listVO(pages.getRecords());
	    
	    // 2. 创建新的分页对象,用于存储视图对象
	    IPage 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
    @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 employees = new ArrayList();
        employees.add(new Employee(1L, "Alice", 50000));
        employees.add(new Employee(2L, "Bob", 40000));
        IPage employeePage = new Page(1, 10, 20); // 当前第1页,每页10条,总共20条
        employeePage.setRecords(employees);

        // 2. 使用 EmployeeWrapper 进行转换
        EmployeeWrapper wrapper = new EmployeeWrapper();
        IPage 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实体类列表转视图列表的资料请关注IT俱乐部其它相关文章!

本文收集自网络,不代表IT俱乐部立场,转载请注明出处。https://www.2it.club/code/java/14459.html
上一篇
下一篇
联系我们

联系我们

在线咨询: QQ交谈

邮箱: 1120393934@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部