成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MapStruct 超神進階用法,讓你的代碼效率提升十倍!

開發 前端
MapStruct 是一個 Java 編譯時注解處理框架,用來自動化將一種 Java Bean 對象映射成另一種類型的對象。

前言

MapStruct 是一個 Java 編譯時注解處理框架,用來自動化將一種 Java Bean 對象映射成另一種類型的對象。

該框架的主要目標是使開發人員在盡可能少的代碼和最低的運行時間成本下實現屬性映射。MapStruct 通過在編譯時生成代碼來實現這點,這與大多數其他 Java Bean 映射框架在運行時通過反射進行映射形成了鮮明對比。

MapStruct 具有以下主要特性:

  • 簡潔: 簡化了 Java Beans 之間轉換的代碼,自動生成使用簡單的賦值語句完成的映射實現。
  • 性能優秀: 由于 MapStruct 是在編譯時生成代碼,不涉及任何反射,因此執行映射的性能優越。
  • 安全: 通過在編譯時生成映射代碼,MapStruct 提供了類型安全的映射,并能在編譯時就發現潛在的錯誤。
  • 靈活: 可通過自定義轉換方法、類型轉換和映射策略等來滿足復雜的映射需求。
  • 良好的 IDE 支持: 由于 MapStruct 是編譯時工具,所以擁有良好的 IDE 集成,如代碼自動完成、錯誤高亮等。

總的來說, MapStruct 是一個強大且靈活的映射框架,很好的解決有關對象轉換的問題,實現了代碼的簡潔和性能的兼顧。MapStruct的常規用法,網上有很多教程了,本文將列舉一些進階用法,方便日常開發使用。

expression

在轉化的時候,執行 java 表達式,直接看例子:

@Mapper(componentModel = "spring")
public interface MyMapper {
    @Mapping(target = "createTime", expression = "java(System.currentTimeMillis())")
    Target toTarget(Source source);
}

轉化成 target 對象時,createTime字段的值,會設置為System.currentTimeMillis(),生成的代碼如下:

@Component
public class MyMapperImpl implements MyMapper {

    @Override
    public Target toTarget(Source source) {
        Target target = new Target();
        target.setCreateTime( System.currentTimeMillis() );
        return target;
    }
}

qualifiedByName

做映射時,默認情況下,從source 字段到target 字段是直接使用 get/set,如下:

@Data
publicclass Source {
    private String name;
}

@Data
publicclass Target {
    private String name;
}
    

@Mapper(componentModel = "spring")
publicinterface MyMapper {
    Target toTarget(Source source);
}

生成的轉化代碼類如下:

@Component
publicclass MyMapperImpl implements MyMapper {

    @Override
    public Target toTarget(Source source) {
        if ( source == null ) {
            returnnull;
        }

        Target target = new Target();

        // 無腦 set/get
        target.setName( source.getName() );

        return target;
    }
}

如果這種直接的 set/get 無法滿足需求,比如需要把 name 轉化成大寫格式,那么可以使用qualifiedByName:

@Mapper(componentModel = "spring")
public interface MyMapper {
    @Mapping(target = "name", source = "name", qualifiedByName = "toUpperCase")
    Target toTarget(Source source);

    @Named("toUpperCase")
    default String toUpperCase(String value) {
        // 這里寫轉換大寫的邏輯
        return value == null ? null : value.toUpperCase();
    }
}

生成的代碼如下:

@Component
publicclass MyMapperImpl implements MyMapper {

    @Override
    public Target toTarget(Source source) {
        if ( source == null ) {
            returnnull;
        }

        Target target = new Target();

        target.setName( toUpperCase( source.getName() ) );

        return target;
    }
}

nullValueMappingStrategy

如果 source 為 null 時,對應的 target 的處理策略,默認是 NullValueMappingStrategy.RETURN_NULL,即 target 中對應的字段也設置為 null。

但有時候設置為 null 可能不符合我們的需求,關注工眾號:碼猿技術專欄,回復關鍵詞:1111 獲取阿里內部Java性能調優手冊!比如 target 中有個 List ids,我們希望如果 source 中ids 為 null 時,target 的 ids 設置為空 list。這時候可以使用nullValueMappingStrategy策略中的NullValueMappingStrategy.RETURN_DEFAULT

nullValueMappingStrategy 可以使用在某個方法上(只對該方法生效),也可以使用在類上(對類中的所有方法都生效),如下:

@Component
publicclass MyMapperImpl implements MyMapper {

    @Override
    public Target toTarget(Source source) {
        if ( source == null ) {
            returnnull;
        }

        Target target = new Target();

        target.setName( source.getName() );
        List<Integer> list = source.getIds();
        if ( list != null ) {
            target.setIds( new ArrayList<Integer>( list ) );
        }
        else {
            target.setIds( null );
        }

        return target;
    }
}

指定NullValueMappingStrategy.RETURN_DEFAULT策略后:

@Mapper(componentModel = "spring",
        nullValueMappingStrategy = org.mapstruct.NullValueMappingStrategy.RETURN_DEFAULT)
publicinterface MyMapper {

    Target toTarget(Source source);
}

@Component
publicclass MyMapperImpl implements MyMapper {
    @Override
    public Target toTarget(Source source) {

        Target target = new Target();

        if ( source != null ) {
            target.setName( toUpperCase( source.getName() ) );
            List<Integer> list = source.getIds();
            if ( list != null ) {
                target.setIds( new ArrayList<Integer>( list ) );
            }
            else {
                target.setIds( new ArrayList<Integer>() );
            }
        }

        return target;
    }
}

可以看到,當 source 或者 source.ids 為 null 時,返回的 target 和 target.ids 都是默認的空值(空對象+空 list)。

Decorator

你可以通過創建一個 Decorator 類來對你的方法進行修飾并實現全局處理。

以下是一個例子:

public abstractclass YourMapperDecorator implements YourMapper {

    privatefinal YourMapper delegate;

    public YourMapperDecorator(YourMapper delegate) {
        this.delegate = delegate;
    }

    @Override
    public Target toTarget(Source source) {
        Target result = delegate.toTarget(source);
        if (result != null) {
            if (result.getField() == null) {
                result.setField("");
            }
            // 你可以在這里對其他字段進行同樣的處理...
        }
        return result;
    }
}

然后你只需在你的 Mapper 接口上添加 @DecoratedWith 注解:

@Mapper
@DecoratedWith(YourMapperDecorator.class)
public interface YourMapper {
    Target toTarget(Source source);
}

這樣,每次調用 toTarget 方法時,YourMapperDecorator 中的實現會被調用。在這里,你可以實現任何你想要的邏輯,例如對空字段賦予特定的默認值。

責任編輯:武曉燕 來源: 碼猿技術專欄
相關推薦

2024-10-09 12:18:38

2023-06-13 13:52:00

Java 7線程池

2024-06-27 11:22:34

2022-10-27 07:09:34

DjangoAPIRedis

2017-12-06 08:06:47

IBMGPU機器學習

2024-12-06 06:20:00

代碼枚舉

2023-02-06 07:17:22

2017-09-26 14:56:57

MongoDBLBS服務性能

2023-05-31 07:24:48

2020-09-16 16:07:34

Chrome插件瀏覽器

2023-09-07 11:29:36

API開發

2020-07-08 17:06:00

Python開發工具

2025-05-26 00:02:00

TypeScriptGo 語言前端

2022-12-13 08:45:01

3F傾聽模型

2018-09-27 15:42:15

Python編程語言技術

2023-05-16 06:50:50

prompt郵件語法

2021-08-17 14:30:09

Windows電腦微軟

2020-07-21 15:40:55

NginxJava服務器

2022-03-04 11:47:40

烏克蘭網站網絡安全衛星系統

2025-02-27 09:46:55

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久免费视频1 | 国产精品入口麻豆www | 蜜臀网| 久久精彩视频 | 久久亚洲视频网 | 久久精品小视频 | 国产一二区在线 | 午夜理伦三级理论三级在线观看 | 国产一区二区三区 | 久久久亚洲综合 | 97伦理影院 | 中文成人无字幕乱码精品 | 中文字幕乱码视频32 | 久久久久国产精品一区二区 | 中文字幕精品视频在线观看 | 日韩精品在线观看一区二区三区 | 久久高清免费视频 | 亚洲欧美中文日韩在线v日本 | 色中文在线 | 国产精品成人免费 | 久久久久亚洲精品 | 成人一级黄色毛片 | 成人av一区二区三区 | 黄色一级毛片 | 国产无套一区二区三区久久 | 成人免费共享视频 | 伊人精品一区二区三区 | 亚洲视频中文字幕 | 亚洲精品视频在线播放 | 国产日韩欧美激情 | 国产在线视频在线观看 | 国产在线观看一区 | av在线天堂网 | 成人高潮片免费视频欧美 | 欧美色综合天天久久综合精品 | 欧区一欧区二欧区三免费 | 欧产日产国产精品视频 | 99国产视频 | 成人福利网站 | 一区二区三区四区电影视频在线观看 | 一级黄色录像片子 |