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

MapStruct 進階技巧:提升代碼效率

開發 前端
MapStruct 是一個 Java 編譯時注解處理框架,用來自動化將一種 Java Bean 對象映射成另一種類型的對象。該框架的主要目標是使開發人員在盡可能少的代碼和最低的運行時間成本下實現屬性映射。MapStruct 通過在編譯時生成代碼來實現這點,這與大多數其他 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
public class Source {
    private String name;
}

@Data
public class Target {
    private String name;
}
    

@Mapper(componentModel = 'spring')
public interface MyMapper {
    Target toTarget(Source source);
}

生成的轉化代碼類如下:

@Component
public class MyMapperImpl implements MyMapper {

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

        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
public class MyMapperImpl implements MyMapper {

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

        Target target = new Target();

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

        return target;
    }
}

nullValueMappingStrategy

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

但有時候設置為 null 可能不符合我們的需求,比如 target 中有個 List ids,我們希望如果 source 中ids 為 null 時,target 的 ids 設置為空 list。這時候可以使用nullValueMappingStrategy策略中的NullValueMappingStrategy.RETURN_DEFAULT。

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

@Component
public class MyMapperImpl implements MyMapper {

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

        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)
public interface MyMapper {

    Target toTarget(Source source);
}

@Component
public class 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 abstract class YourMapperDecorator implements YourMapper {

    private final 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 中的實現會被調用。在這里,你可以實現任何你想要的邏輯,例如對空字段賦予特定的默認值。

責任編輯:武曉燕 來源: 一安未來
相關推薦

2025-05-26 04:00:00

2025-01-10 08:38:16

2024-06-27 11:22:34

2025-01-07 10:48:08

2021-04-30 07:33:35

效率提升技巧

2024-11-19 15:28:15

2020-07-08 17:06:00

Python開發工具

2017-03-07 14:26:19

Eclipse技巧效率

2022-04-29 08:15:40

Python技巧Max

2025-03-03 00:15:00

JavaScript開發效率

2023-11-06 16:08:24

JavaList開發

2009-06-05 15:04:36

Eclipse代碼模版

2022-09-23 08:00:00

開發安全低代碼平臺

2011-05-07 14:00:44

打印效率提升技巧

2023-09-26 00:00:20

JS簡寫技巧

2024-12-16 17:20:17

MySQL通配符

2022-07-18 08:08:16

Go?語言技巧

2024-01-03 18:01:48

Code技巧開發

2025-03-04 13:00:00

JavaScrip代碼語言

2023-09-19 10:31:09

算法數據
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 最新av中文字幕 | 一区二区三区欧美 | www.日本精品 | 国产激情精品 | 中文字幕一区二区三区四区五区 | 99成人| 亚洲欧美成人在线 | 91毛片在线看 | 日韩在线国产精品 | 巨大黑人极品videos精品 | 午夜精品久久久久久久久久久久久 | 亚洲国产成人精品女人久久久野战 | 久久色视频 | 黄网站在线播放 | 久久精品视频在线免费观看 | 日韩国产精品一区二区三区 | 狠狠干天天干 | 亚洲免费精品一区 | 亚洲午夜一区二区 | 午夜精品一区 | 伊人超碰 | 午夜视频在线播放 | 国产成人影院 | 性在线 | 亚洲免费大片 | 欧美成人激情 | 国产成人精品网站 | 综合网伊人 | 久久精品青青大伊人av | 久久成人精品视频 | 9久久婷婷国产综合精品性色 | 一级片网址 | 午夜男人的天堂 | 色婷婷综合久久久久中文一区二区 | 成人毛片视频在线播放 | 五月天婷婷激情 | 亚洲欧美在线观看 | 国产999精品久久久 午夜天堂精品久久久久 | 国色天香成人网 | 日韩高清中文字幕 | 亚洲欧美一区二区三区在线 |