概要
処理販売において、我々は、多くの場合、データ構造にエンティティ、ボー、Voの層データ、エンティティ永続化層の対応する(典型的には、マッピングモデルデータベーステーブル)の間でデータを変換することができる、ボーは、対応するサービス・レイヤ・オペレーションのデータ構造であります、Voはデータ構造コントローラとクライアントの相互作用です。財産の大部分は、使用時には、我々は再割り当てしていきます、これらのデータ構造の間で同じであってもよいです。
以下のような:ウェブ管理者にクライアントトランスポート層、我々は情報AdminVo受信を使用しますが、サービス層に、私はAdminBoインスタンスへの割り当ての属性AdminVo例にAdminBo、あなたが必要なこの時間を使用する必要がある場合。
々BeanUtils
春は提供org.springframework.beans.BeanUtilsのようなクラスの高速の割り当てを、:
AdminEntityクラス
public class AdminEntity{
private Integer id;
private String password;
private String username;
private String userImg;
.... //一些 Set Get方法
}
AdminVoクラス、およびので、クライアントが扱っているので、パスワードのプロパティは、ここでは適していません
public class AdminVo{
private Integer id;
private String username;
private String userImg;
.... //一些 Set Get方法
}
我々はAdminVoインスタンスであることをAdminEntityインスタンスの属性値に必要がある場合(ボー層を無視し、右)
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
ローカルループの割り当て、(コードが外を見るために、複数で書かれた)離れて最適化することができます。そして、エレガントな方法2を見て
第二の方法(エレガント、お勧めします)
これは次のように、改善することができる汎用的なコードを書くための私の最初の時間です:
ColaBeanUtilsクラス(コーラが私たちの犬の名前であり、ハハ)
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の使用:
@FunctionalInterface
public interface ColaBeanUtilsCallBack<S, T> {
void callBack(S t, T s);
}
次のように使用されます:
List<AdminEntity> adminList = ...;
return ColaBeanUtils.copyListProperties(adminList, AdminVo::new);
あなたがループの中で必要性処理(補正)を行う場合には、ラムダ式を使用します。
List<Article> adminEntityList = articleMapper.getAllArticle();
List<ArticleVo> articleVoList = ColaBeanUtils.copyListProperties(adminEntityList , ArticleVo::new, (articleEntity, articleVo) -> {
// 回调处理
});
return articleVoList;
ただ、あまりにも簡単ではありません!!!
概要
AdminVo::new
Supplier<T> target
少し印象を見て前に、私は今日の用途を期待していなかったので、この私は完全にジェネリック医薬品のVIII章の「Javaのコア技術のボリューム第10版」を、参照しました。@FunctionalInterface
これはのjava8あるlambda
クラスのノート、リファレンスの発現java.util.function.Consumer
インタフェース。私は書かれて見て、知識の前に置く、混乱を期待していなかった、ハハ、唖然。
コードは完全に偶然です場合。もし汎用コードだけでなく、改善、以下のコメントで発生することがあり、エリアはどうもありがとうございました、ありがとうございます♪(・ω・)テクノ。
個人ブログのURL:https://colablog.cn/
あなたに私の記事が助けた場合、私は公共のマイクロチャネル番号、あなたの記事を共有するための最初の時間に集中することができます