MapStruct: отображение объектов коллекций на основе свойств его типа - PullRequest
0 голосов
/ 02 ноября 2018

В моем приложении есть следующий Java-бин

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"}. Теперь мне нужно отобразить состояния как часть Associate mapper, но отображение должно возвращать только status и statusType, если 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?

1 Ответ

0 голосов
/ 04 ноября 2018

Более элегантный способ добиться того, что вы пытаетесь сделать, - это использовать пользовательское сопоставление между статусами.

В вашем случае это будет выглядеть так:

@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 будет использовать этот

...