首页 > 解决方案 > MapStruct : Mapping Collections objects based on it's type's properties

问题描述

I have a following java bean in my application

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
 }

And possible values for Status.statusTypes are {"O", "P", "R", "S", "A"}. Now I need to map statuses as part of Associate mapper but mapping should only return status and statusType if statusType matches any of {"O", "A", "P"} ?

As of now I'm doing custom default method in mapper like below

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);
}

Is there any elegant way than this using mapStruct config itself?

标签: javajava-8mapstruct

解决方案


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

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

@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 将使用该方法


推荐阅读