java - 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?
解决方案
实现您想要做的更优雅的方法是使用状态之间的自定义映射。
在您的情况下,它看起来像:
@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 将使用该方法
推荐阅读
- forms - 浏览器是否将表单操作查询字符串参数与字段合并?
- excel - 在VBA中为指定范围的平均值创建函数
- three.js - 如何返回 THREE.Perspective 相机的截锥体并将其存储为变量?
- javascript - 如何创建指向最初使用 slideToggle 隐藏的部分的链接
- r - R:特定目录中的海量文件重命名为四位数格式
- javascript - 如何更改条件中表达式的评估以检查 Javascript 中的布尔值?
- powershell - SharePoint 内容编辑器 Web 部件清单
- vector - 如何打印 Vec 中每个元素的索引和值?
- javascript - 单击响应式菜单时导航按钮会移动
- visual-studio-2017 - 无法单独调试单一理论