转string_MapStruct高级用法:List和String互转

需求背景:有一个业务对象,数据库里存的是分号隔开的String,在返回给前台时需要转换成List

dao类TNotice中

@ApiModelProperty(value = "附件地址,以分号隔开")
private String attachments;

vo类NoticeVo中

@ApiModelProperty(value = "附件地址列表")
private List attachmentList;

mapStruct类中的写法

@Mapper(componentModel = "spring")
public interface NoticeExchange {
  @Mappings({
          @Mapping(source = "attachments", target = "attachmentList"),
          @Mapping(source = "types", target = "typeList")
  })
  NoticeVo dao2Vo(TNotice dao);

  @Mappings({
          @Mapping(source = "attachmentList", target = "attachments"),
          @Mapping(source = "typeList", target = "types")
  })
  TNotice vo2dao(NoticeVo vo);

  // str转list
  default List<String> str2List(String src){
      String[] split = src.split(";");
      List<String> result = Arrays.asList(split);
      return result;
  }

  // list转str
  default String list2Str(List<String> src){
      if (CollUtil.isEmpty(src)) {
          return "";
      }
      StringBuffer sb = new StringBuffer();
      src.stream().forEach(item -> sb.append(item).append(";"));
      return sb.toString();
  }
}

当需要String转List时,MapStruct会自动调用str2List。当需要list转string时,会自动调用list2Str

50c3a200a40d64a247fdec968a0c539f.png

MapStruct 入门篇中的内容

对于代码中 JavaBean之间的转换, 一直是困扰我很久的事情。在开发的时候我看到业务代码之间有很多的 JavaBean 之间的相互转化, 非常的影响观感, 却又不得不存在。我后来想的一个办法就是通过反射, 或者自己写很多的转换器。

第一种通过反射的方法确实比较方便, 但是现在无论是 BeanUtils, BeanCopier 等在使用反射的时候都会影响到性能。虽然我们可以进行反射信息的缓存来提高性能。但是像这种的话, 需要类型和名称都一样才会进行映射, 有很多时候, 由于不同的团队之间使用的名词不一样, 还是需要很多的手动 set/get 等功能。

第二种的话就是会很浪费时间, 而且在添加新的字段的时候也要进行方法的修改。不过, 由于不需要进行反射, 其性能是很高的。

MapStruct 带来的改变

MapSturct 是一个生成 类型安全, 高性能且无依赖的 JavaBean 映射代码的注解处理器(annotation processor)。

抓一下重点:

  1. 注解处理器

  2. 可以生成 JavaBean 之间那的映射代码

  3. 类型安全, 高性能, 无依赖性

从字面的理解, 我们可以知道, 该工具可以帮我们实现 JavaBean 之间的转换, 通过注解的方式。

同时, 作为一个工具类,相比于手写, 其应该具有便捷, 不容易出错的特点。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想在将一个 `List` 换成另一个 `List` 的过程中,使用某个特定的映射方法来进行换,可以使用 MapStruct 提供的 `@IterableMapping` 注解。 举个例子,假设我们有两个类 `Source` 和 `Target`: ```java public class Source { private String name; private int age; // getter/setter } public class Target { private String fullName; private int yearsOld; // getter/setter } ``` 现在我们有一个 `List<Source>`,我们希望使用一个名为 `sourceToTargetWithName` 的映射方法将其中的对象换成 `Target` 对象,我们可以定义一个映射方法: ```java @Mapper public interface SourceTargetMapper { @Mapping(source = "name", target = "fullName") @Mapping(source = "age", target = "yearsOld") Target sourceToTargetWithName(Source source); @IterableMapping(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT, elementTargetType = Target.class) List<Target> sourceListToTargetListWithName(List<Source> sourceList); } ``` 在上面的代码中,我们使用 `@Mapping` 注解来指定将 `Source` 的 `name` 属性映射到 `Target` 的 `fullName` 属性,将 `Source` 的 `age` 属性映射到 `Target` 的 `yearsOld` 属性。然后我们定义了一个 `sourceListToTargetListWithName` 方法,该方法使用 `@IterableMapping` 注解来标记这是一个 `List` 类型的映射方法,并且使用 `elementTargetType` 属性来指定要换成的目标类型。在方法内部,我们使用 `stream()` 方法遍历 `List`,然后对每个对象使用 `sourceToTargetWithName()` 方法进行换。 需要注意的是,我们需要将 `@IterableMapping` 注解的 `nullValueMappingStrategy` 属性设置为 `NullValueMappingStrategy.RETURN_DEFAULT`,否则在换过程中,如果某个对象不符合换条件,会将其换成 `null`,从而导致 `NullPointerException`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值