首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MapStruct:映射前筛选列表

MapStruct:映射前筛选列表
EN

Stack Overflow用户
提问于 2019-03-29 19:14:09
回答 1查看 5.6K关注 0票数 3

我在其他地方看到过这个问题,但并不是在完全相同的背景下提出的,而且没有一个适用于我们用例的答案。

假设我在源对象中有一个list字段:

代码语言:javascript
复制
List<MySourceElement> mySourceList;

以及相应的目标字段:

代码语言:javascript
复制
List<MyTargetElement> myTargetList;

我只想在执行一个标准的mySourceList映射器将MySourceElement映射到myTargetList之前,能够通过MySourceElement的某些属性过滤源mySourceList中的元素。

假设MySourceElement有一个布尔属性isValid,我们的过滤器谓词是简单的(isValid == true),而MyTargetElement没有对应的布尔值。

我尝试过许多方法,包括@DecoratedWith和qualifiedBy:

  1. @DecoratedWith对于这样一个简单的用例来说,用Guice注入变得太复杂了/太复杂了,而且这个特性在MapStruct文档中也被列为jsr330的实验性特性。
  2. qualifiedBy没有工作(也就是说,我无法获得在实现中应用qualifiedBy方法的映射)。

qualifiedBy方法类似于:

代码语言:javascript
复制
@FilterForValid    
public List<MySourceElement> filterForValid(List<MySourceElement> mySourceElement) {
    ... implementation ...
}

我的地图宣言是这样的:

代码语言:javascript
复制
@Mapping(source = "mySourceList", target = "myTargetList", qualifiedBy = FilterForValid.class)
Target sourceToTarget(Source source);

我想要一个qualifiedBy的实现,比如:

代码语言:javascript
复制
target.withMyTargetList( 
    mySourceListToMyTargetList(filterUtil.filterForValid(source.getMySourceList)));    

与其让qualifiedBy工作,我会很高兴找到如何使用@BeforeMapping来实现这一点,但我不清楚如何从文档中实现这一点,特别是因为对于所有意图和目的,源对象应该被认为是不可变的。

任何关于以这种方式调用映射器的最简单的、首选的方法来进行集合过滤的指导都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-29 19:56:08

这里有一个被请求的特性地图/地图#1610,它允许对类似的东西使用开箱即用的支持。尽管如此,解决这一问题的一种方法是使用@Context注释。然后,您的映射器可以看起来如下:

代码语言:javascript
复制
@Mapper
public interface MyMapper {


    Target map(Source source, @Context Predicate<MySourceElement> predicate);

    default List<MySourceElement> mapAndFilter(List<MySourceElement> list, @Context Predicate<MySourceElement> predicate) {
        List<MySourceElement> newList = new ArrayList<>();
        for(MySourceElement el : list) {
            if (predicate.test(el)) {
                newList.add(map(el));
            }
        }

        return newList;
    }

    MySourceElement map(MySourceElement el);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55424178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档