MapStruct:基于其类型的属性映射集合对象

MapStruct : Mapping Collections objects based on it's type's properties

我的应用程序中有一个以下 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"} 中的任何一个,则映射应该只 return status 和 statusType ?

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

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 配置本身更优雅的方法?

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

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

@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<Status> 之间映射,那么 MapStruct 将使用那个