【问题标题】:MapStruct : Mapping Collections objects based on it's type's propertiesMapStruct :根据类型的属性映射集合对象
【发布时间】:2019-04-06 23:36:49
【问题描述】:

我的应用程序中有一个以下 java bean

public class Status{

      private String statusType;
      private String status;
      private String statusCode;
      //getters and setters 
}


public class Associate{
        private String name;
        private String id;
        private List<Status> statuses;
        //getters & setters
 }

Status.statusTypes 的可能值是 {"O", "P", "R", "S", "A"}。现在我需要将状态映射为关联映射器的一部分,但如果 statusType 与 {"O", "A", "P"} 中的任何一个匹配,则映射应该只返回状态和状态类型?

到目前为止,我正在像下面这样在映射器中执行自定义默认方法

public AssociateMapper{
  Predicate<Status> status = (sts) -> null != sts &&null!=sts.getStatusType                                          
                                       && "O|A|P".contains(sts.getStatusType());    
 @Mappings({
            //some mappings   
          @Mapping(target = "statuses", expression = "java(associate.getStatuses().stream().filter(status).collect(Collectors.toList()))" )
          })
          Associate mapAssociate(Associate associate);
}

有没有比使用 mapStruct 配置本身更优雅的方法?

【问题讨论】:

  • 你尝试了什么,代码在哪里,什么没有成功?
  • 用我的足迹更新了问题

标签: java java-8 mapstruct


【解决方案1】:

实现您想要做的事情的更优雅的方法是使用状态之间的自定义映射。

在你的情况下,它看起来像:

@Mapper
public AssociateMapper{

    Associate mapAssociate(Associate associate);

    default List<Status> mapStatuses(List<Status> statuses) {
        return statuses.stream()
            .filter(Objects::nonNull)
            .filter(status -> Objects.equals("O", status.getStatusType()) || Objects.equals("A", status.getStatusType()) || Objects.equals("P", status.getStatusType()))
            .collect(Collectors.toList());
    }
}

您在表达式中所做的可以成为Status(es) 列表的自定义映射的一部分。如果有一个在List&lt;Status&gt; 之间映射的自定义方法,那么 MapStruct 将使用该方法

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 2013-01-07
    • 2022-10-23
    • 2012-11-08
    相关资源
    最近更新 更多