最牛逼(没有之一)的bean拷贝工具类-map-struct
2020-07-20 本文已影响0人
东阿
非标题党,就是最强的 属性复制工具。
https://mapstruct.org/
平时开发中常用bean复制的工具类,基本都用到了反射,性能始终差强人意。
但是我们都是懒人,让我手写get set把一个对象完美赋值给另一个对象,那实在是太难为我了。
大杀器来了 mapstruct。
先上结论,原理是通过自动代码生成,根据生成的接口,自动帮你写出类属性复制的代码。
接口定义如下
/**
* 所用到的实体类A
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
@FieldDefaults(level = AccessLevel.PRIVATE) //这个注解可以给属性自动加上private
public class CateSelector {
/**
* 行业id
*/
List<Long> industryIds;
/**
* 一级类目id
*/
List<Long> cateLevel1Ids;
/**
* 2级类目id
*/
List<Long> cateLevel2Ids;
/**
* 3级类目id
*/
List<Long> cateLevel3Ids;
/**
* 4级类目id
*/
List<Long> cateLevel4Ids;
/**
* 5级类目id
*/
List<Long> cateLevel5Ids;
/**
* 叶子类目id
*/
List<Long> cateIds;
}
这是转换的目标类 dto
/**
* @author qingshu
*/
@NoArgsConstructor
@AllArgsConstructor
@Data
@Builder
@FieldDefaults(level = AccessLevel.PRIVATE)
public class CateSelectorDTO implements Serializable {
/**
* 行业id
*/
List<Long> industryIds;
/**
* 一级类目id
*/
List<Long> cateLevel1Ids;
/**
* 2级类目id
*/
List<Long> cateLevel2Ids;
/**
* 3级类目id
*/
List<Long> cateLevel3Ids;
/**
* 4级类目id
*/
List<Long> cateLevel4Ids;
/**
* 5级类目id
*/
List<Long> cateLevel5Ids;
/**
* 叶子类目id
*/
List<Long> cateIds;
}
重头戏来了,这是我们要写的转换工具类
/**
* @author qingshu
*/
@Mapper
public interface CateConvert {
CateConvert INSTANCE = Mappers.getMapper(CateConvert.class);
/**
* 转换 CateSelectorDTO->CateSelector
*/
CateSelector toSelector(CateSelectorDTO dto);
/**
* 转换 CateSelector->CateSelectorDTO
*/
CateSelectorDTO toDTO(CateSelector selector);
}
灰常的简单,只是一个接口,使用的时候直接
CateConvert.INSTANCE.toSelector()
静态方法,安全无害。
更牛逼的是,使用的是自动代码生成,下面是生成出来的方法。
@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 里面可以自动解析各种类型,支持list,甚至支持循环嵌套对象,比如Tree 对象里有个 类型为 Tree 的属性,这种,也是支持的。
map-struce 强大 恐怖如斯。