Java8流式API将实体类列表转换为视图对象列表的示例
作者:码农研究僧
这篇文章主要介绍了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实体类列表转视图列表的资料请关注脚本之家其它相关文章!