最牛逼(没有之一)的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 强大 恐怖如斯。

上一篇下一篇

猜你喜欢

热点阅读