简化java代码:mapstruct + 策略模式

本文介绍如何利用MapStruct结合策略模式来简化Java中的对象属性拷贝,包括相同类型但属性名不同的转换和不同类型之间的转换。通过自定义策略,可以减少if-else语句,并提供更优雅的集合拷贝方式。
摘要由CSDN通过智能技术生成

目录

目的

准备

注意

相同类型-属性名不同

实体类 

映射

使用

验证-查看实现类

测试

不同类型(策略模式)

 实体类

映射

工具类

使用:对象拷贝

验证-查看实现类

测试

使用:集合拷贝

测试

策略模式说明

准备-依赖


目的

简化 BeanUtils.copyProperties 属性对拷代码,自动生成空判断,结合策略模式自定义转换

集合对拷:一行代码就能完成以前 先new,再 for循环,再add的多行代码,而且也不用判空

准备

这里我将开发中经常用到的全部依赖都列举出来(若下载不下来依赖,将settings.xml替换成我博客存档的那一份),此处为了不影响观看,放在文章末尾处。

注意

写好转换之后,maven 记得 clean install,查看一下生成的实现类有没有问题

实现类在  target 里面,若target没有,执行下列操作

相同类型-属性名不同

将 下面 Doctor 中的  i1  s1  分别转给 DoctorDto 中的  i2  s2

实体类 

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Doctor {
    private int id;
    private String name;
    String s1;
    int i1;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DoctorDto {
    private int id;
    private String name;
    private String s2;
    private int i2;
}

映射

@Mapper(componentModel = "spring")
public interface BeanConvert {

    BeanConvert INSTANCE = Mappers.getMapper(BeanConvert.class);

    /**
     * 不一致的属性映射
     */
    @Mappings({
            @Mapping(target = "i2", source = "i1"),
            @Mapping(target = "s2", source = "s1")
    })
    DoctorDto toDto(Doctor doctor);
}

使用

    @GetMapping("/test")
    public DoctorDto get() {
        Doctor doctor = new Doctor();
        doctor.setId(1);
        doctor.setName("张三");
        doctor.setI1(1);
        doctor.setS1("1");
        return BeanConvert.INSTANCE.toDto(doctor);
    }

验证-查看实现类

clean install  重启

测试

可以看到 i1,s1中的值已经过来了

不同类型(策略模式)

 实体类

将下面 Sku2 中的  Long date  Integer code  分别转给 SkuDTO2 中的  Date date  String value

 一个是时间戳转换,一个是枚举转换

@Data
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class Sku2 {
    Long skuId;
    String skuCode;
    String skuPrice;
    List<String> nameList;
    Long date;
    Integer code;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class SkuDTO2 {
    Long skuId;
    String skuCode;
    String skuPrice;
    List<String> nameList;
    Date date;
    String value;
}

映射

uses 定义了两个策略,一个负责转换时间戳,一个负责转换枚举

@Mapper(componentModel = "spring", uses = {TimeConvertStrategy.class, EnumConvertStrategy.class})
public interface BeanConvert {

    /**
     * 策略模式测试
     */
    @Mapping(target = "value", source = "code")
    SkuDTO2 domain2Dto(Sku2 sku2);

}
@Component
public class EnumConvertStrategy {

    public String convert(Integer code) {
        return MyEnum.getByCode(code);
    }
    
}
@Component
public class TimeConvertStrategy {

    public Date date2TimeStamp(Long timeStamp) {
        if (timeStamp == null) {
            return null;
        }
        return new Date(timeStamp);
    }
    
}
public enum MyEnum {
    A(1,"哈哈"),B(2,"呵呵");

    private final Integer code;
    private final String msg;

    MyEnum(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }

    public Integer getCode() {
        return code;
    }

    public String getMsg() {
        return msg;
    }

    public static String getByCode(Integer code) {
        if (code == null) {
            return null;
        }
        for (MyEnum value : MyEnum.values()) {
            if (value.getCode().equals(code)) {
                return value.
  • 29
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值