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 将使用那个
我的应用程序中有一个以下 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 将使用那个