Java8流式API將實(shí)體類(lèi)列表轉(zhuǎn)換為視圖對(duì)象列表的示例
從實(shí)戰(zhàn)Demo進(jìn)行學(xué)習(xí):

1. 基本知識(shí)
這段代碼是一個(gè) Java 方法,將一個(gè)實(shí)體類(lèi)列表 (List<E>) 轉(zhuǎn)換為一個(gè)視圖對(duì)象列表 (List<V>)
這里使用了 Java 8 的流 (Stream) API 來(lái)實(shí)現(xiàn)轉(zhuǎn)換
public List<V> listVO(List<E> list) {
return (List) list.stream() // 1. 將輸入的實(shí)體列表轉(zhuǎn)換成流
.map(this::entityVO) // 2. 對(duì)每個(gè)實(shí)體元素應(yīng)用 entityVO 方法進(jìn)行轉(zhuǎn)換
.collect(Collectors.toList()); // 3. 將轉(zhuǎn)換后的流收集成一個(gè)新的列表
}
相關(guān)的基本知識(shí):
list.stream():
list 是一個(gè)List<E>類(lèi)型的輸入?yún)?shù),表示一組實(shí)體類(lèi)對(duì)象 (E)
stream() 方法將集合轉(zhuǎn)為流(Stream),這是 Java 8 引入的流式處理 API,使得對(duì)集合的操作更加簡(jiǎn)潔和可讀.map(this::entityVO):
map 方法是流操作之一,接受一個(gè)函數(shù)式接口(Function)
這里使用了this::entityVO,即調(diào)用當(dāng)前對(duì)象的 entityVO 方法
entityVO 方法將每個(gè)實(shí)體對(duì)象 (E) 轉(zhuǎn)換成一個(gè)視圖對(duì)象 (V)。假設(shè) entityVO 方法的返回類(lèi)型是 V。.collect(Collectors.toList()):
collect 是流的終端操作之一,用于將流轉(zhuǎn)換為某種集合
在這里,Collectors.toList() 將流中的元素收集成一個(gè)新的List<V>
總的來(lái)說(shuō),entityVO 方法的作用是將實(shí)體類(lèi)對(duì)象 (E) 轉(zhuǎn)換為視圖對(duì)象 (V)
這個(gè)方法通常是開(kāi)發(fā)者根據(jù)業(yè)務(wù)需求自行定義的
它可能只是從實(shí)體對(duì)象中提取必要的字段來(lái)構(gòu)建一個(gè)簡(jiǎn)化的視圖對(duì)象
2. Demo
使用了 Java 8 的流式處理 API,通過(guò) map 方法將實(shí)體對(duì)象列表轉(zhuǎn)換為視圖對(duì)象列表。
這種方式常用于將數(shù)據(jù)庫(kù)實(shí)體類(lèi)轉(zhuǎn)換為前端展示需要的簡(jiǎn)化視圖對(duì)象,避免暴露敏感數(shù)據(jù)或不必要的字段
為更好的展示具體的使用邏輯,以測(cè)試Demo為例
基本目錄如下:

完整Demo如下:
// 實(shí)體類(lèi)
class Employee {
private String name;
private int age;
private double salary;
// 構(gòu)造函數(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;
}
}
// 視圖對(duì)象類(lèi)
class EmployeeVO {
private String name;
private int age;
// 構(gòu)造函數(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;
}
}
// 轉(zhuǎn)換方法所在的類(lèi)
class EmployeeService {
// 將 Employee 實(shí)體轉(zhuǎn)換為 EmployeeVO 視圖對(duì)象
private EmployeeVO entityVO(Employee employee) {
return new EmployeeVO(employee.getName(), employee.getAge());
}
// 將 Employee 列表轉(zhuǎn)換為 EmployeeVO 列表
public List<EmployeeVO> listVO(List<Employee> list) {
return (List<EmployeeVO>) list.stream() // 將 Employee 列表轉(zhuǎn)為流
.map(this::entityVO) // 調(diào)用 entityVO 方法轉(zhuǎn)換為 EmployeeVO
.collect(Collectors.toList()); // 收集結(jié)果到一個(gè) 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 類(lèi)是實(shí)體類(lèi),包含了 name、age 和 salary 等字段,表示員工的詳細(xì)信息
- EmployeeVO 類(lèi)是視圖對(duì)象類(lèi),只包含 name 和 age 字段,適合用來(lái)展示在 UI 中,不包含敏感數(shù)據(jù)如 salary
- entityVO 方法負(fù)責(zé)將 Employee 實(shí)體對(duì)象轉(zhuǎn)換為 EmployeeVO 視圖對(duì)象
在這個(gè)例子中,entityVO 方法只提取了 name 和 age 字段 - listVO 方法接受一個(gè)
List<Employee>參數(shù),使用 stream() 方法將其轉(zhuǎn)化為流,然后通過(guò)map(this::entityVO)將每個(gè) Employee 對(duì)象轉(zhuǎn)換為 EmployeeVO 對(duì)象,最后使用collect(Collectors.toList())將結(jié)果收集成一個(gè)新的List<EmployeeVO>
3. 拓展
還有一種分頁(yè)的轉(zhuǎn)換實(shí)現(xiàn):
通過(guò)Java 泛型實(shí)體類(lèi)與視圖對(duì)象分頁(yè)轉(zhuǎn)換的封裝實(shí)現(xiàn)
pageVO 方法的目的是將分頁(yè)的實(shí)體類(lèi)對(duì)象 (IPage<E>) 轉(zhuǎn)換為分頁(yè)的視圖對(duì)象 (IPage<V>),并保留分頁(yè)的元信息(如當(dāng)前頁(yè)、每頁(yè)大小、總記錄數(shù))。這種封裝常用于服務(wù)層返回統(tǒng)一格式的分頁(yè)數(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. 獲取分頁(yè)數(shù)據(jù)中的記錄列表,并通過(guò) listVO 方法將其從實(shí)體類(lèi)轉(zhuǎn)換為視圖對(duì)象
List<V> records = this.listVO(pages.getRecords());
// 2. 創(chuàng)建新的分頁(yè)對(duì)象,用于存儲(chǔ)視圖對(duì)象
IPage<V> pageVo = new Page<>(pages.getCurrent(), pages.getSize(), pages.getTotal());
// 3. 將轉(zhuǎn)換后的視圖對(duì)象列表設(shè)置到新的分頁(yè)對(duì)象中
pageVo.setRecords(records);
// 4. 返回包含視圖對(duì)象的分頁(yè)結(jié)果
return pageVo;
}
}
示例Demo如下:
// 實(shí)體類(lèi)
class Employee {
private Long id;
private String name;
private double salary;
// 構(gòu)造函數(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; }
}
// 視圖對(duì)象類(lèi)
class EmployeeVO {
private Long id;
private String name;
// 構(gòu)造函數(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 實(shí)現(xiàn)
public class EmployeeWrapper extends BaseEntityWrapper<Employee, EmployeeVO> {
// 實(shí)現(xiàn)抽象方法:將 Employee 轉(zhuǎn)換為 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)建模擬分頁(yè)數(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); // 當(dāng)前第1頁(yè),每頁(yè)10條,總共20條
employeePage.setRecords(employees);
// 2. 使用 EmployeeWrapper 進(jìn)行轉(zhuǎn)換
EmployeeWrapper wrapper = new EmployeeWrapper();
IPage<EmployeeVO> employeeVOPage = wrapper.pageVO(employeePage);
// 3. 輸出轉(zhuǎn)換后的分頁(yè)結(jié)果
System.out.println("分頁(yè)元信息:");
System.out.println("當(dāng)前頁(yè):" + employeeVOPage.getCurrent());
System.out.println("每頁(yè)大小:" + employeeVOPage.getSize());
System.out.println("總記錄數(shù):" + employeeVOPage.getTotal());
System.out.println("\n分頁(yè)記錄:");
employeeVOPage.getRecords().forEach(vo ->
System.out.println("ID: " + vo.getId() + ", Name: " + vo.getName())
);
}
}
類(lèi)似輸出如下:
分頁(yè)元信息:
當(dāng)前頁(yè):1
每頁(yè)大?。?0
總記錄數(shù):20
分頁(yè)記錄:
ID: 1, Name: Alice
ID: 2, Name: Bob
以上就是Java8流式API將實(shí)體類(lèi)列表轉(zhuǎn)換為視圖對(duì)象列表的示例的詳細(xì)內(nèi)容,更多關(guān)于Java8 API實(shí)體類(lèi)列表轉(zhuǎn)視圖列表的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Maven本地倉(cāng)庫(kù)的配置以及修改默認(rèn).m2倉(cāng)庫(kù)位置
今天小編就為大家分享一篇關(guān)于Maven本地倉(cāng)庫(kù)的配置以及修改默認(rèn).m2倉(cāng)庫(kù)位置的文章,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-10-10
SpringBoot整合SpringCloud的過(guò)程詳解
SpringCloud專(zhuān)注于為典型的用例和擴(kuò)展機(jī)制提供良好的開(kāi)箱即用體驗(yàn),在介紹SpringCloud默認(rèn)使用的注冊(cè)中心前,先給大家介紹下分布式系統(tǒng)的三個(gè)指標(biāo),具體內(nèi)容詳情跟隨小編一起看看吧2021-09-09
使用Nacos實(shí)現(xiàn)動(dòng)態(tài)路由的步驟和代碼示例
這篇文章主要介紹了使用 Nacos 實(shí)現(xiàn) Spring Cloud Gateway 的動(dòng)態(tài)路由,本文給大家介紹了具體的實(shí)現(xiàn)步驟和代碼案例,感興趣的小伙伴跟著小編一起來(lái)看看吧2024-09-09
java中Date類(lèi)和Strng類(lèi)的靈活轉(zhuǎn)化
這篇文章主要介紹了java中Date類(lèi)和Strng類(lèi)的靈活轉(zhuǎn)化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Java用自定義的類(lèi)作為HashMap的key值實(shí)例
下面小編就為大家?guī)?lái)一篇Java用自定義的類(lèi)作為HashMap的key值實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12

