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

非标题党,就是最强的 属性复制工具。
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 强大 恐怖如斯。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354