1. 程式人生 > >優雅的使用BeanUtils對List集合的操作

優雅的使用BeanUtils對List集合的操作

摘要

我們在Entity、Bo、Vo層資料間可能經常轉換資料,Entity對應的是持久層資料結構(一般是資料庫表的對映模型)、Bo對應的是業務層操作的資料結構、Vo就是Controller和客戶端互動的資料結構。在這些資料結構之間很大一部分屬性都可能會相同,我們在使用的時候會不斷的重新賦值。
如:客戶端傳輸管理員資訊的到Web層,我們會使用AdminVo接收,但是到了Service層時,我就需要使用AdminBo,這時候就需要把AdminVo例項的屬性一個一個賦值到AdminBo例項中。

BeanUtils

Spring 提供了 org.springframework.beans.BeanUtils 類進行快速賦值,如:

AdminEntity類

public class AdminEntity{
    private Integer id;
    
    private String password;

    private String username;

    private String userImg;
    .... //一些 Set Get方法
}

AdminVo類,因為是和客戶端打交道的,所以password屬性就不適合在這裡了

public class AdminVo{
    private Integer id;

    private String username;

    private String userImg;
    .... //一些 Set Get方法
}

假如我們需要把AdminEntity例項屬性值賦值到AdminVo例項中(暫時忽略Bo層吧)

    AdminEntity entity = ...;
    AdminVo vo = new AdminEntity();
    // org.springframework.beans.BeanUtils
    BeanUtils.copyProperties(entity, vo); // 賦值

那麼這樣AdminVo例項中的屬性值就和AdminEntity例項中的屬性值一致了。
但是如果我們是一個集合的時候就不能這樣直接賦值了。如:

        List<Admin> adminList = ...;
        List<AdminVo> adminVoList = new ArrayList<>(adminList.size());
        BeanUtils.copyProperties(adminList, adminVoList); // 賦值失敗

這樣直接賦值是不可取的,由方法名(copyProperties)可知,只會複製他們的屬性值,那麼上述的adminList屬性和adminVoList的屬性是沒有半毛錢關係的。那麼怎麼解決了?

方式一(暴力解決,不推薦)

程式碼如下:

        List<Admin> adminList = ...;
        List<AdminVo> adminVoList = new ArrayList<>(adminList.size());
        for (Admin admin : adminList) {
            AdminVo adminVo = new AdminVo();
            BeanUtils.copyProperties(admin, adminVo);
            adminVoList.add(adminVo);
        }
    return adminVoList;

雖然for迴圈可以解決,但是一點都不優雅,這樣的程式碼也會陸續增多,程式碼多了,就會看出來了重複的地方,沒錯!就是for迴圈賦值的地方,完全可以優化掉(程式碼寫多了一眼就看出來了)。那麼請看優雅的方式二

方式二 (優雅、推薦)

這也是我第一次寫泛型的程式碼,可能有待提高,如下:
ColaBeanUtils類(Cola是我家的狗狗名,哈哈)

import org.springframework.beans.BeanUtils;

public class ColaBeanUtils extends BeanUtils {

    public static <S, T> List<T> copyListProperties(List<S> sources, Supplier<T> target) {
        return copyListProperties(sources, target, null);
    }

    /**
     * @author Johnson
     * 使用場景:Entity、Bo、Vo層資料的複製,因為BeanUtils.copyProperties只能給目標物件的屬性賦值,卻不能在List集合下迴圈賦值,因此新增該方法
     * 如:List<AdminEntity> 賦值到 List<AdminVo> ,List<AdminVo>中的 AdminVo 屬性都會被賦予到值
     * S: 資料來源類 ,T: 目標類::new(eg: AdminVo::new)
     */
    public static <S, T> List<T> copyListProperties(List<S> sources, Supplier<T> target, ColaBeanUtilsCallBack<S, T> callBack) {
        List<T> list = new ArrayList<>(sources.size());
        for (S source : sources) {
            T t = target.get();
            copyProperties(source, t);
            list.add(t);
            if (callBack != null) {
                // 回撥
                callBack.callBack(source, t);
            }
        }
        return list;
    }

ColaBeanUtilsCallBack介面,使用java8的lambda表示式註解:

@FunctionalInterface
public interface ColaBeanUtilsCallBack<S, T> {

    void callBack(S t, T s);
}

使用方式如下:

    List<AdminEntity> adminList = ...;
        return ColaBeanUtils.copyListProperties(adminList, AdminVo::new);

如果需要在迴圈中做處理(回撥),那麼可使用lambda表示式:

        List<Article> adminEntityList = articleMapper.getAllArticle();
        List<ArticleVo> articleVoList = ColaBeanUtils.copyListProperties(adminEntityList , ArticleVo::new, (articleEntity, articleVo) -> {
            // 回撥處理
        });
        return articleVoList;

簡直不要太簡單了!!!

總結

AdminVo::new配合Supplier<T> target這裡我完全是參考《Java核心技術第十版 卷一》的第八章泛型,因為之前看過有點印象,沒想到今天用到了。@FunctionalInterface這個是java8的lambda表示式的註解類,參考java.util.function.Consumer介面。沒想到懵懵懂懂的,就把之前看過的知識寫出來了,驚呆了,哈哈。
程式碼如果雷同,純屬巧合。若泛型的程式碼還有可以改進的地方,可在下方留言,非常感謝,Thanks♪(・ω・)ノ。

個人部落格網址: https://colablog.cn/

如果我的文章幫助到您,可以關注我的微信公眾號,第一時間分享文章給您

相關推薦

優雅的使用BeanUtilsList集合操作

摘要 我們在Entity、Bo、Vo層資料間可能經常轉換資料,Entity對應的是持久層資料結構(一般是資料庫表的對映模型)、Bo對應的是業務層操作的資料結構、Vo就是Controller和客戶端互動的資料結構。在這些資料結構之間很大一部分屬性都可能會相同,我們在使用的時候會不斷的重新賦值。 如:客戶端傳輸管

JavaList集合的常用操作 北京java 基礎

實現 seve 常用 style println lis spec 最終 處理 有時候,我們需要從一個系統裏導出數據,並導入另外一個系統中,而這個數據很大,而數據導入受到限制,無法實現,這時,我們就需要對數據進行List切分,然後再一個個導出,最終,實現數據導入。對於數據的

Java中List集合的常用操作

stat sub 增強for循環 增強for 類型轉換 per sem 數值 tor 目錄: list中添加,獲取,刪除元素; list中是否包含某個元素; list中根據索引將元素數值改變(替換); list中查看(判斷)元素的索引; 根據元素索引位置進行的判斷; 利

利用redis快取 list集合中的資料 進行分頁操作(一)

先說 儲存的結構:  這裡做了兩塊快取  綠色是儲存索引的快取  黑色是存資料的快取 翻頁時需要兩個引數  向上查詢/或向下查詢    還一個是   從第二頁開始查詢時需要一個索引的引數 有了這兩個引數 就可以利用redis 中提供的方法進行操作 第一個是 jedis.z

List集合中的資料進行去重操作

======================== 說明:我使用的方法是將list集合中的資料遍歷後,然後丟到set集合中。(原因就是set集合中不能儲存重複的資料),雖然這個方法比較笨,但至少暫時是可以使用的。。。這裡要注意的是,如果是判斷物件是否重複,那麼在那個物件中需要

C#中List集合操作IEqualityComparer正確使用方法

基礎 類型 con sealed check reference tle list集合 union C#中List集合操作IEqualityComparer正確使用方法 Except、Intersect、Union方法中的IEqualityComparer 怎麽使用 對於普

List集合進行排序

ons etag span bsp -s str int tor vat 一、說明 使用Collections工具類的sort方法對list進行排序 新建比較器Comparator 二、代碼 排序: import java.util.ArrayList; import

2018.9.26 如何List集合中的元素進行排序?

lec str 有時 etag gets sets ava int private Collections對List集合中的數據進行排序 有時候需要對集合中的元素按照一定的規則進行排序,這就需要用到 Java中提供的對集合進行操作的工具類Collections,其中的sor

java List Collections 根據時間List集合內的元素排序

按時間正序排序。 核心程式碼 List<Folderfile> folderfiles = new ArrayList<>(); ...往集合裡新增元素此處省略..... Collections.sort(folderfiles, new Comparator

list集合中的物件 進行排序

根據觀看次數的多少排序 ( resultList集合中是IndexCardResult物件,通過IndexCardResult中的屬性viewNum的多少對集合排序) Collections.sort(resultList,new Comparator<IndexCardResult>

JavaList分段操作的方法介紹

有時候,我們需要從一個系統裡匯出資料,並匯入另外一個系統中,而這個資料很大,而資料匯入受到限制,無法實現,這時,我們就需要對資料進行List切分,然後再一個個匯出,最終,實現資料匯入。 對於資料的分段處理,我們可以採用subList方法進行實現,具體用法可參看以下案例: import jav

list集合中物件日期排序

程式碼直接用就好! 傳入一個  集合物件 ,我的bean中時間屬性是 date 型別; private static void ListSort(List<JzdtInfo> list) { { //排序方法 Collections.sort(lis

在java中LIst集合的兩種排序方法(即sort的使用方法)

List集合的排序: java提供了兩種排序方式,分別是Collections.sort(List)和Collections.sort(List,Commparator),下面就這兩種方法的使用做詳細的說明: -Collections.sort(List); sort的引數是一

Java8新特性 利用流和Lambda表示式List集合進行處理

Lambda表示式處理List 最近在做專案的過程中經常會接觸到 lambda 表示式,隨後發現它基本上可以替代所有 for 迴圈,包括增強for迴圈。也就是我認為,絕大部分的for迴圈都可以用 lambda 表示式改寫。 lambda表示式有它自己的優點:(1)簡潔,(2)易平行計算。尤其適用於遍歷結果

【Java基礎】Json字串轉物件和轉List集合操作

to今天發現專案中需要拿到對接系統中傳值的Json,需要轉換成List集合。回顧下Json字串的操作,寫了個測試。 public class JsonToUtil {     private  static final  Logger log = LoggerFactor

Java -- List集合進行分頁

 通過使用hdfs api將檔案系統根目錄下的檔案列表給列出來了,demo 如下輸出json如下:[ { "path": "/20150129101639203.jpg", "replicat

如何List集合中的物件進行按某個屬性排序

我們在實際的開發工作中,經常會碰到排序的問題,如題,我們如何針對List集合中的某一個屬性進行排序先舉一個簡單的例子:package test; import java.util.ArrayList; import java.util.List; import java.u

List集合嵌套了map集合的排序

如題,一個List<Map<String, String>> Lists = new ArrayList<Map<String, String>>();

List集合根據Map裡某個keyList集合重新排序介紹

例1:List集合資料參考形式如下: [{GLXXLX=03,GLXXBH=20160226105812003},{GLXXLX=01,GLXXBH=20160226105812001},{GLXXLX=02,GLXXBH=20160226105812002}

List集合嵌套了map集合double值進行排序

/*[ { "repairo": "asda", "num": 88.71 }, { "repairo": "fghfghfgh", "num": 50 }, { "repairo": "ytutyu", "num": 5.47 }, { "repairo": "qweqe", "num": 4.17 } ]