最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java8流式API將實(shí)體類列表轉(zhuǎn)換為視圖對(duì)象列表的示例

 更新時(shí)間:2024年11月22日 10:42:36   作者:碼農(nóng)研究僧  
這篇文章主要介紹了Java8流式API將實(shí)體類列表轉(zhuǎn)換為視圖對(duì)象列表的示例,文中有相關(guān)的代碼示例供大家參考,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

從實(shí)戰(zhàn)Demo進(jìn)行學(xué)習(xí):

1. 基本知識(shí)

這段代碼是一個(gè) Java 方法,將一個(gè)實(shí)體類列表 (List<E>) 轉(zhuǎn)換為一個(gè)視圖對(duì)象列表 (List<V>)

這里使用了 Java 8 的流 (Stream) API 來實(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> 類型的輸入?yún)?shù),表示一組實(shí)體類對(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 方法的返回類型是 V。
  • .collect(Collectors.toList())
    collect 是流的終端操作之一,用于將流轉(zhuǎn)換為某種集合
    在這里,Collectors.toList() 將流中的元素收集成一個(gè)新的 List<V>

總的來說,entityVO 方法的作用是將實(shí)體類對(duì)象 (E) 轉(zhuǎn)換為視圖對(duì)象 (V)
這個(gè)方法通常是開發(fā)者根據(jù)業(yè)務(wù)需求自行定義的
它可能只是從實(shí)體對(duì)象中提取必要的字段來構(gòu)建一個(gè)簡(jiǎn)化的視圖對(duì)象

2. Demo

使用了 Java 8 的流式處理 API,通過 map 方法將實(shí)體對(duì)象列表轉(zhuǎn)換為視圖對(duì)象列表。
這種方式常用于將數(shù)據(jù)庫實(shí)體類轉(zhuǎn)換為前端展示需要的簡(jiǎn)化視圖對(duì)象,避免暴露敏感數(shù)據(jù)或不必要的字段

為更好的展示具體的使用邏輯,以測(cè)試Demo為例

基本目錄如下:

完整Demo如下:

// 實(shí)體類
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ì)象類
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)換方法所在的類
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 類是實(shí)體類,包含了 name、age 和 salary 等字段,表示員工的詳細(xì)信息
  • EmployeeVO 類是視圖對(duì)象類,只包含 name 和 age 字段,適合用來展示在 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)化為流,然后通過 map(this::entityVO) 將每個(gè) Employee 對(duì)象轉(zhuǎn)換為 EmployeeVO 對(duì)象,最后使用 collect(Collectors.toList()) 將結(jié)果收集成一個(gè)新的 List<EmployeeVO>

3. 拓展

還有一種分頁的轉(zhuǎn)換實(shí)現(xiàn):

通過Java 泛型實(shí)體類與視圖對(duì)象分頁轉(zhuǎn)換的封裝實(shí)現(xiàn)

pageVO 方法的目的是將分頁的實(shí)體類對(duì)象 (IPage<E>) 轉(zhuǎn)換為分頁的視圖對(duì)象 (IPage<V>),并保留分頁的元信息(如當(dāng)前頁、每頁大小、總記錄數(shù))。這種封裝常用于服務(wù)層返回統(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 方法將其從實(shí)體類轉(zhuǎn)換為視圖對(duì)象
	    List<V> records = this.listVO(pages.getRecords());
	    
	    // 2. 創(chuàng)建新的分頁對(duì)象,用于存儲(chǔ)視圖對(duì)象
	    IPage<V> pageVo = new Page<>(pages.getCurrent(), pages.getSize(), pages.getTotal());
	    
	    // 3. 將轉(zhuǎn)換后的視圖對(duì)象列表設(shè)置到新的分頁對(duì)象中
	    pageVo.setRecords(records);
	    
	    // 4. 返回包含視圖對(duì)象的分頁結(jié)果
	    return pageVo;
	}

}

示例Demo如下:

// 實(shí)體類
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ì)象類
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)建模擬分頁數(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頁,每頁10條,總共20條
        employeePage.setRecords(employees);

        // 2. 使用 EmployeeWrapper 進(jìn)行轉(zhuǎn)換
        EmployeeWrapper wrapper = new EmployeeWrapper();
        IPage<EmployeeVO> employeeVOPage = wrapper.pageVO(employeePage);

        // 3. 輸出轉(zhuǎn)換后的分頁結(jié)果
        System.out.println("分頁元信息:");
        System.out.println("當(dāng)前頁:" + 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())
        );
    }
}

類似輸出如下:

分頁元信息:
當(dāng)前頁:1
每頁大?。?0
總記錄數(shù):20
分頁記錄:
ID: 1, Name: Alice
ID: 2, Name: Bob

以上就是Java8流式API將實(shí)體類列表轉(zhuǎn)換為視圖對(duì)象列表的示例的詳細(xì)內(nèi)容,更多關(guān)于Java8 API實(shí)體類列表轉(zhuǎn)視圖列表的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • SpringBoot項(xiàng)目啟動(dòng)慢的5個(gè)優(yōu)化技巧

    SpringBoot項(xiàng)目啟動(dòng)慢的5個(gè)優(yōu)化技巧

    SpringBoot以其約定優(yōu)于配置的理念和快速開發(fā)的能力,已成為Java生態(tài)中最受歡迎的框架之一,然而,隨著項(xiàng)目規(guī)模的擴(kuò)大,許多開發(fā)者會(huì)發(fā)現(xiàn)一個(gè)令人頭疼的問題:應(yīng)用啟動(dòng)時(shí)間越來越長(zhǎng),本文將深入分析SpringBoot啟動(dòng)慢的根本原因,并分享5個(gè)經(jīng)過實(shí)戰(zhàn)驗(yàn)證的優(yōu)化技巧
    2026-03-03
  • jdk21安裝后無jre文件該如何解決

    jdk21安裝后無jre文件該如何解決

    java開發(fā)少不了安裝jdk,下面這篇文章主要給大家介紹了關(guān)于jdk21安裝后無jre文件該如何解決的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-05-05
  • Java并發(fā)編程之詳解CyclicBarrier線程同步

    Java并發(fā)編程之詳解CyclicBarrier線程同步

    在之前的文章中已經(jīng)為大家介紹了java并發(fā)編程的工具:BlockingQueue接口,ArrayBlockingQueue,DelayQueue,LinkedBlockingQueue,PriorityBlockingQueue,SynchronousQueue,BlockingDeque接口,ConcurrentHashMap,CountDownLatch,本文為系列文章第十篇,需要的朋友可以參考下
    2021-06-06
  • SpringMVC和rabbitmq集成的使用案例

    SpringMVC和rabbitmq集成的使用案例

    這篇文章主要介紹了SpringMVC和rabbitmq集成的使用案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 基于spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate(詳解)

    基于spring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate(詳解)

    下面小編就為大家?guī)硪黄趕pring boot 1.5.4 集成 jpa+hibernate+jdbcTemplate(詳解)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java線程池的拒絕策略實(shí)現(xiàn)詳解

    Java線程池的拒絕策略實(shí)現(xiàn)詳解

    這篇文章主要介紹了Java線程池的拒絕策略實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • MyBatis實(shí)現(xiàn)if-else的示例代碼

    MyBatis實(shí)現(xiàn)if-else的示例代碼

    MyBatis實(shí)現(xiàn)if-else功能可以通過和標(biāo)簽來完成,這些標(biāo)簽提供了一種類似于Java中switch語句的方式來處理多分支條件邏輯,下面就來具體了解一下
    2025-11-11
  • Springboot使用sharedingjdbc實(shí)現(xiàn)分庫分表

    Springboot使用sharedingjdbc實(shí)現(xiàn)分庫分表

    這篇文章主要介紹了Springboot使用sharedingjdbc實(shí)現(xiàn)分庫分表,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Java IText異常NoClassDefFoundError: org/bouncycastle/asn1/ASN1Encodable的解決方法

    Java IText異常NoClassDefFoundError: org/bouncycastle

    在使用Java進(jìn)行PDF文檔操作時(shí),iText是一個(gè)非常強(qiáng)大的庫,然而,在實(shí)際開發(fā)過程中,可能會(huì)遇到一些異常情況,其中之一就是??NoClassDefFoundError: org/bouncycastle/asn1/ASN1Encodable??,本文將探討這個(gè)錯(cuò)誤的原因及其解決方案,需要的朋友可以參考下
    2025-02-02
  • Java基礎(chǔ)教程之對(duì)象的方法與數(shù)據(jù)成員

    Java基礎(chǔ)教程之對(duì)象的方法與數(shù)據(jù)成員

    這篇文章主要介紹了Java基礎(chǔ)教程之對(duì)象的方法與數(shù)據(jù)成員,本文講解對(duì)象的方法與數(shù)據(jù)成員相關(guān)知識(shí),因?yàn)閖ava是面向?qū)ο笳Z言,本文的知識(shí)都是經(jīng)常要用到的,需要的朋友可以參考下
    2014-08-08

最新評(píng)論

腾冲县| 延津县| 万源市| 屯昌县| 郎溪县| 偏关县| 合江县| 襄垣县| 灵川县| 武威市| 上虞市| 黑山县| 浦江县| 盐边县| 淮滨县| 响水县| 塘沽区| 余庆县| 长丰县| 长春市| 西青区| 阿勒泰市| 土默特左旗| 永登县| 长汀县| 洛浦县| 汤原县| 石渠县| 宁国市| 浠水县| 唐河县| 迭部县| 渝北区| 栾川县| 三亚市| 白银市| 余姚市| 麻城市| 丹寨县| 安远县| 苏尼特左旗|