優雅的使用BeanUtils對List集合的操作
摘要
我們在Entity、Bo、Vo層資料間可能經常轉換資料,Entity對應的是持久層資料結構(一般是資料庫表的對映模型)、Bo對應的是業務層操作的資料結構、Vo就是Controller和客戶端互動的資料結構。在這些資料結構之間很大一部分屬性都可能會相同,我們在使用的時候會不斷的重新賦值。
如:客戶端傳輸管理員資訊的到Web層,我們會使用AdminVo接收,但是到了Service層時,我就需要使用AdminBo,這時候就需要把AdminVo例項的屬性一個一個賦值到AdminBo例項中。
BeanUtils
Spring 提供了 org.springframework.beans.BeanUtils 類進行快速賦值,如:
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/
如果我的文章幫助到您,可以關注我的微信公眾號,第一時間分享文章給您
相關推薦
優雅的使用BeanUtils對List集合的操作
摘要 我們在Entity、Bo、Vo層資料間可能經常轉換資料,Entity對應的是持久層資料結構(一般是資料庫表的對映模型)、Bo對應的是業務層操作的資料結構、Vo就是Controller和客戶端互動的資料結構。在這些資料結構之間很大一部分屬性都可能會相同,我們在使用的時候會不斷的重新賦值。 如:客戶端傳輸管
Java對List集合的常用操作 北京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>
Java對List分段操作的方法介紹
有時候,我們需要從一個系統裡匯出資料,並匯入另外一個系統中,而這個資料很大,而資料匯入受到限制,無法實現,這時,我們就需要對資料進行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裡某個key對List集合重新排序介紹
例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 } ]