gpt4 book ai didi

MapStruct:在映射之前过滤列表

转载 作者:行者123 更新时间:2023-12-05 06:27:13 28 4
gpt4 key购买 nike

我在其他地方看到过这个问题,但不是在相同的上下文中,也没有适合我们用例的答案。

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

List<MySourceElement> mySourceList;

和相应的目标字段:

List<MyTargetElement> myTargetList;

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

假设 MySourceElement 有一个 bool 属性 isValid 并且我们的过滤谓词很简单 (isValid == true),而 MyTargetElement 没有相应的 bool 值。

我尝试了很多方法,包括@DecoratedWith 和 qualifiedBy:

  1. 对于这样一个简单的用例,@DecoratedWith 与 Guice 注入(inject)变得过于复杂/令人费解,并且此功能也在 MapStruct 文档中列为 jsr330 的实验性功能。

  2. qualifiedBy 不工​​作(即,我无法让 mapstruct 在实现中应用 qualifiedBy 方法)。

qualifiedBy 方法类似于:

@FilterForValid    
public List<MySourceElement> filterForValid(List<MySourceElement> mySourceElement) {
... implementation ...
}

我的映射器声明是这样的:

@Mapping(source = "mySourceList", target = "myTargetList", qualifiedBy = FilterForValid.class)
Target sourceToTarget(Source source);

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

target.withMyTargetList( 
mySourceListToMyTargetList(filterUtil.filterForValid(source.getMySourceList)));

代替让 qualifiedBy 工作,我很乐意弄清楚如何为此使用 @BeforeMapping,但我不清楚如何从文档中做到这一点,特别是因为出于所有意图和目的源对象应该被认为是不可变的。

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

最佳答案

有一个请求的功能 mapstruct/mapstruct#1610这将允许在此处使用开箱即用的支持。话虽如此,解决这个问题的方法是使用 @Context 注释。你的映射器看起来像:

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

关于MapStruct:在映射之前过滤列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55424178/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com