Java8流式API將實體類列表轉換為視圖對象列表的示例
從實戰(zhàn)Demo進行學習:
1. 基本知識
這段代碼是一個 Java 方法,將一個實體類列表 (List<E>)
轉換為一個視圖對象列表 (List<V>)
這里使用了 Java 8 的流 (Stream) API 來實現(xiàn)轉換
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>
類型的輸入?yún)?shù),表示一組實體類對象 (E)
stream() 方法將集合轉為流(Stream),這是 Java 8 引入的流式處理 API,使得對集合的操作更加簡潔和可讀.map(this::entityVO)
:
map 方法是流操作之一,接受一個函數(shù)式接口(Function)
這里使用了this::entityVO
,即調(diào)用當前對象的 entityVO 方法
entityVO 方法將每個實體對象 (E) 轉換成一個視圖對象 (V)。假設 entityVO 方法的返回類型是 V。.collect(Collectors.toList())
:
collect 是流的終端操作之一,用于將流轉換為某種集合
在這里,Collectors.toList() 將流中的元素收集成一個新的List<V>
總的來說,entityVO 方法的作用是將實體類對象 (E) 轉換為視圖對象 (V)
這個方法通常是開發(fā)者根據(jù)業(yè)務需求自行定義的
它可能只是從實體對象中提取必要的字段來構建一個簡化的視圖對象
2. Demo
使用了 Java 8 的流式處理 API,通過 map 方法將實體對象列表轉換為視圖對象列表。
這種方式常用于將數(shù)據(jù)庫實體類轉換為前端展示需要的簡化視圖對象,避免暴露敏感數(shù)據(jù)或不必要的字段
為更好的展示具體的使用邏輯,以測試Demo為例
基本目錄如下:
完整Demo如下:
// 實體類 class Employee { private String name; private int age; private double salary; // 構造函數(shù)和 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; // 構造函數(shù)和 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) // 調(diào)用 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 中,不包含敏感數(shù)據(jù)如 salary
- entityVO 方法負責將 Employee 實體對象轉換為 EmployeeVO 視圖對象
在這個例子中,entityVO 方法只提取了 name 和 age 字段 - listVO 方法接受一個
List<Employee>
參數(shù),使用 stream() 方法將其轉化為流,然后通過map(this::entityVO)
將每個 Employee 對象轉換為 EmployeeVO 對象,最后使用collect(Collectors.toList())
將結果收集成一個新的List<EmployeeVO>
3. 拓展
還有一種分頁的轉換實現(xiàn):
通過Java 泛型實體類與視圖對象分頁轉換的封裝實現(xiàn)
pageVO 方法的目的是將分頁的實體類對象 (IPage<E>)
轉換為分頁的視圖對象 (IPage<V>)
,并保留分頁的元信息(如當前頁、每頁大小、總記錄數(shù))。這種封裝常用于服務層返回統(tǒng)一格式的分頁數(shù)據(jù)
模版如下:
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. 獲取分頁數(shù)據(jù)中的記錄列表,并通過 listVO 方法將其從實體類轉換為視圖對象 List<V> records = this.listVO(pages.getRecords()); // 2. 創(chuàng)建新的分頁對象,用于存儲視圖對象 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; // 構造函數(shù)、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; // 構造函數(shù)、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 實現(xiàn)
public class EmployeeWrapper extends BaseEntityWrapper<Employee, EmployeeVO> { // 實現(xiàn)抽象方法:將 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. 創(chuàng)建模擬分頁數(shù)據(jù) 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("總記錄數(shù):" + employeeVOPage.getTotal()); System.out.println("\n分頁記錄:"); employeeVOPage.getRecords().forEach(vo -> System.out.println("ID: " + vo.getId() + ", Name: " + vo.getName()) ); } }
類似輸出如下:
分頁元信息:
當前頁:1
每頁大?。?0
總記錄數(shù):20
分頁記錄:
ID: 1, Name: Alice
ID: 2, Name: Bob
以上就是Java8流式API將實體類列表轉換為視圖對象列表的示例的詳細內(nèi)容,更多關于Java8 API實體類列表轉視圖列表的資料請關注腳本之家其它相關文章!
相關文章
使用Nacos實現(xiàn)動態(tài)路由的步驟和代碼示例
這篇文章主要介紹了使用 Nacos 實現(xiàn) Spring Cloud Gateway 的動態(tài)路由,本文給大家介紹了具體的實現(xiàn)步驟和代碼案例,感興趣的小伙伴跟著小編一起來看看吧2024-09-09