最牛逼(沒有之一)的bean拷貝工具類-map-struct

非標(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)大 恐怖如斯季希。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末褪那,一起剝皮案震驚了整個(gè)濱河市幽纷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌博敬,老刑警劉巖友浸,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異偏窝,居然都是意外死亡收恢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門祭往,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伦意,“玉大人,你說我怎么就攤上這事硼补⊥匀猓” “怎么了?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵括勺,是天一觀的道長。 經(jīng)常有香客問我曲掰,道長疾捍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任栏妖,我火速辦了婚禮乱豆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吊趾。我一直安慰自己宛裕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布论泛。 她就那樣靜靜地躺著揩尸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屁奏。 梳的紋絲不亂的頭發(fā)上岩榆,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音坟瓢,去河邊找鬼勇边。 笑死,一個(gè)胖子當(dāng)著我的面吹牛折联,可吹牛的內(nèi)容都是我干的粒褒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼诚镰,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼奕坟!你這毒婦竟也來了祥款?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤执赡,失蹤者是張志新(化名)和其女友劉穎镰踏,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沙合,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奠伪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了首懈。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绊率。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖究履,靈堂內(nèi)的尸體忽然破棺而出滤否,到底是詐尸還是另有隱情,我是刑警寧澤最仑,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布藐俺,位于F島的核電站,受9級(jí)特大地震影響泥彤,放射性物質(zhì)發(fā)生泄漏欲芹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一吟吝、第九天 我趴在偏房一處隱蔽的房頂上張望菱父。 院中可真熱鬧,春花似錦剑逃、人聲如沸浙宜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粟瞬。三九已至,卻和暖如春萤捆,著一層夾襖步出監(jiān)牢的瞬間亩钟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國打工鳖轰, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留清酥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓蕴侣,卻偏偏與公主長得像焰轻,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子昆雀,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354