美文网首页
最牛逼(没有之一)的bean拷贝工具类-map-struct

最牛逼(没有之一)的bean拷贝工具类-map-struct

作者: 东阿 | 来源:发表于2020-07-20 16:48 被阅读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 强大 恐怖如斯。

    相关文章

      网友评论

          本文标题:最牛逼(没有之一)的bean拷贝工具类-map-struct

          本文链接:https://www.haomeiwen.com/subject/dcsykktx.html