亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java8流式API將實體類列表轉換為視圖對象列表的示例

 更新時間:2024年11月22日 10:42:36   作者:碼農(nóng)研究僧  
這篇文章主要介紹了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實體類列表轉視圖列表的資料請關注腳本之家其它相關文章!

相關文章

  • Maven本地倉庫的配置以及修改默認.m2倉庫位置

    Maven本地倉庫的配置以及修改默認.m2倉庫位置

    今天小編就為大家分享一篇關于Maven本地倉庫的配置以及修改默認.m2倉庫位置的文章,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • SpringBoot整合SpringCloud的過程詳解

    SpringBoot整合SpringCloud的過程詳解

    SpringCloud專注于為典型的用例和擴展機制提供良好的開箱即用體驗,在介紹SpringCloud默認使用的注冊中心前,先給大家介紹下分布式系統(tǒng)的三個指標,具體內(nèi)容詳情跟隨小編一起看看吧
    2021-09-09
  • 使用Nacos實現(xiàn)動態(tài)路由的步驟和代碼示例

    使用Nacos實現(xiàn)動態(tài)路由的步驟和代碼示例

    這篇文章主要介紹了使用 Nacos 實現(xiàn) Spring Cloud Gateway 的動態(tài)路由,本文給大家介紹了具體的實現(xiàn)步驟和代碼案例,感興趣的小伙伴跟著小編一起來看看吧
    2024-09-09
  • 淺談Java的WeakHashMap源碼

    淺談Java的WeakHashMap源碼

    這篇文章主要介紹了淺談Java的WeakHashMap源碼,WeakHashMap,從名字可以看出它是某種?Map,它的特殊之處在于?WeakHashMap?里的entry可能會被GC自動刪除,即使程序員沒有調(diào)用remove()或者clear()方法,需要的朋友可以參考下
    2023-09-09
  • 深入理解Java設計模式之組合模式

    深入理解Java設計模式之組合模式

    這篇文章主要介紹了JAVA設計模式之組合模式的的相關資料,文中示例代碼非常詳細,供大家參考和學習,感興趣的朋友可以了解下
    2021-11-11
  • java實現(xiàn)留言板功能實例

    java實現(xiàn)留言板功能實例

    這篇文章主要為大家詳細介紹了JSP+JavaBean的留言板技術 ,JavaWeb登陸功能實現(xiàn)代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • SpringBoot增量/瘦身部署jar包的方式

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

    SpringBoot 項目的部署一般采用全量jar 包方式部署相關項目,如果我們對相關的Contrller層進行相關業(yè)務調(diào)整就需要重新編譯全量jar 包太麻煩了,所以本文給大家介紹了使用SpringBoot 的增量/瘦身部署方式,需要的朋友可以參考下
    2024-01-01
  • java中Date類和Strng類的靈活轉化

    java中Date類和Strng類的靈活轉化

    這篇文章主要介紹了java中Date類和Strng類的靈活轉化,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • 詳解基于redis實現(xiàn)分布式鎖

    詳解基于redis實現(xiàn)分布式鎖

    系統(tǒng)的不斷擴大,分布式鎖是最基本的保障。與單機的多線程不一樣的是,分布式跨多個機器。線程的共享變量無法跨機器。本文將介紹基于redis實現(xiàn)分布式鎖。
    2021-06-06
  • Java用自定義的類作為HashMap的key值實例

    Java用自定義的類作為HashMap的key值實例

    下面小編就為大家?guī)硪黄狫ava用自定義的類作為HashMap的key值實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-12-12

最新評論