非標(biāo)題黨力图,就是最強(qiáng)的 屬性復(fù)制工具吃媒。
https://mapstruct.org/
平時(shí)開發(fā)中常用bean復(fù)制的工具類赘那,基本都用到了反射募舟,性能始終差強(qiáng)人意。
但是我們都是懶人拱礁,讓我手寫get set把一個(gè)對(duì)象完美賦值給另一個(gè)對(duì)象呢灶,那實(shí)在是太難為我了。
大殺器來了 mapstruct钉嘹。
先上結(jié)論鸯乃,原理是通過自動(dòng)代碼生成,根據(jù)生成的接口跋涣,自動(dòng)幫你寫出類屬性復(fù)制的代碼飒责。
接口定義如下
/**
* 所用到的實(shí)體類A
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
@FieldDefaults(level = AccessLevel.PRIVATE) //這個(gè)注解可以給屬性自動(dòng)加上private
public class CateSelector {
/**
* 行業(yè)id
*/
List<Long> industryIds;
/**
* 一級(jí)類目id
*/
List<Long> cateLevel1Ids;
/**
* 2級(jí)類目id
*/
List<Long> cateLevel2Ids;
/**
* 3級(jí)類目id
*/
List<Long> cateLevel3Ids;
/**
* 4級(jí)類目id
*/
List<Long> cateLevel4Ids;
/**
* 5級(jí)類目id
*/
List<Long> cateLevel5Ids;
/**
* 葉子類目id
*/
List<Long> cateIds;
}
這是轉(zhuǎn)換的目標(biāo)類 dto
/**
* @author qingshu
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
@FieldDefaults(level = AccessLevel.PRIVATE)
public class CateSelectorDTO implements Serializable {
/**
* 行業(yè)id
*/
List<Long> industryIds;
/**
* 一級(jí)類目id
*/
List<Long> cateLevel1Ids;
/**
* 2級(jí)類目id
*/
List<Long> cateLevel2Ids;
/**
* 3級(jí)類目id
*/
List<Long> cateLevel3Ids;
/**
* 4級(jí)類目id
*/
List<Long> cateLevel4Ids;
/**
* 5級(jí)類目id
*/
List<Long> cateLevel5Ids;
/**
* 葉子類目id
*/
List<Long> cateIds;
}
重頭戲來了例衍,這是我們要寫的轉(zhuǎn)換工具類
/**
* @author qingshu
*/
@Mapper
public interface CateConvert {
CateConvert INSTANCE = Mappers.getMapper(CateConvert.class);
/**
* 轉(zhuǎn)換 CateSelectorDTO->CateSelector
*/
CateSelector toSelector(CateSelectorDTO dto);
/**
* 轉(zhuǎn)換 CateSelector->CateSelectorDTO
*/
CateSelectorDTO toDTO(CateSelector selector);
}
灰常的簡單双霍,只是一個(gè)接口跳芳,使用的時(shí)候直接
CateConvert.INSTANCE.toSelector()
靜態(tài)方法咧擂,安全無害园爷。
更牛逼的是渐裂,使用的是自動(dòng)代碼生成蹦渣,下面是生成出來的方法怠缸。
@Generated(
value = "org.mapstruct.ap.MappingProcessor",
date = "2020-07-20T16:41:41+0800",
comments = "version: 1.3.1.Final, compiler: javac, environment: Java 1.8.0_231 (Oracle Corporation)"
)
public class CateConvertImpl implements CateConvert {
@Override
public CateSelector toSelector(CateSelectorDTO dto) {
if ( dto == null ) {
return null;
}
CateSelectorBuilder cateSelector = CateSelector.builder();
List<Long> list = dto.getIndustryIds();
if ( list != null ) {
cateSelector.industryIds( new ArrayList<Long>( list ) );
}
List<Long> list1 = dto.getCateLevel1Ids();
if ( list1 != null ) {
cateSelector.cateLevel1Ids( new ArrayList<Long>( list1 ) );
}
List<Long> list2 = dto.getCateLevel2Ids();
if ( list2 != null ) {
cateSelector.cateLevel2Ids( new ArrayList<Long>( list2 ) );
}
List<Long> list3 = dto.getCateLevel3Ids();
if ( list3 != null ) {
cateSelector.cateLevel3Ids( new ArrayList<Long>( list3 ) );
}
List<Long> list4 = dto.getCateLevel4Ids();
if ( list4 != null ) {
cateSelector.cateLevel4Ids( new ArrayList<Long>( list4 ) );
}
List<Long> list5 = dto.getCateLevel5Ids();
if ( list5 != null ) {
cateSelector.cateLevel5Ids( new ArrayList<Long>( list5 ) );
}
List<Long> list6 = dto.getCateIds();
if ( list6 != null ) {
cateSelector.cateIds( new ArrayList<Long>( list6 ) );
}
return cateSelector.build();
}
@Override
public CateSelectorDTO toDTO(CateSelector selector) {
if ( selector == null ) {
return null;
}
CateSelectorDTOBuilder cateSelectorDTO = CateSelectorDTO.builder();
List<Long> list = selector.getIndustryIds();
if ( list != null ) {
cateSelectorDTO.industryIds( new ArrayList<Long>( list ) );
}
List<Long> list1 = selector.getCateLevel1Ids();
if ( list1 != null ) {
cateSelectorDTO.cateLevel1Ids( new ArrayList<Long>( list1 ) );
}
List<Long> list2 = selector.getCateLevel2Ids();
if ( list2 != null ) {
cateSelectorDTO.cateLevel2Ids( new ArrayList<Long>( list2 ) );
}
List<Long> list3 = selector.getCateLevel3Ids();
if ( list3 != null ) {
cateSelectorDTO.cateLevel3Ids( new ArrayList<Long>( list3 ) );
}
List<Long> list4 = selector.getCateLevel4Ids();
if ( list4 != null ) {
cateSelectorDTO.cateLevel4Ids( new ArrayList<Long>( list4 ) );
}
List<Long> list5 = selector.getCateLevel5Ids();
if ( list5 != null ) {
cateSelectorDTO.cateLevel5Ids( new ArrayList<Long>( list5 ) );
}
List<Long> list6 = selector.getCateIds();
if ( list6 != null ) {
cateSelectorDTO.cateIds( new ArrayList<Long>( list6 ) );
}
return cateSelectorDTO.build();
}
}
map-struce 里面可以自動(dòng)解析各種類型鹏浅,支持list嗅义,甚至支持循環(huán)嵌套對(duì)象,比如Tree 對(duì)象里有個(gè) 類型為 Tree 的屬性隐砸,這種之碗,也是支持的。
map-struce 強(qiáng)大 恐怖如斯季希。