我正在使用 Mapstruct 来处理将一个 POJO 映射到另一个 POJO 的样板代码。
这是 DTO:
import java.util.Collection;
public class TestTO {
String name;
Collection<AttributeTO> attributes;
}
这是映射的 POJO:
import java.util.Map;
public class Test {
String name;
Map<String, Attribute> attributes;
}
我正在寻找一种优雅的方式来处理Map
和Collection
之间的映射。目前,我正在使用 @Mapping
注释的 expression
属性。由于 Attribute
引用 Test
,我使用的是“循环映射”示例中的 CycleBreakingContext
。
@Mapping(target = "attributes", expression = "java(test.getAttributes().values().stream().map(a -> this.map(a, context)).collect(java.util.stream.Collectors.toList()))")
abstract TestTO map(Test test, @Context CycleBreakingContext context);
该接口(interface)还包含一个将 Attribute
映射到 AttributeTO
的方法,名称为 map
。
有没有更优雅的方法来实现不可迭代的Map
到Collection
的转换?我的方法有效,但也有缺点。例如,重构无法识别字符串中的代码片段。
最佳答案
默认映射器方法怎么样?
在映射器接口(interface)中,您可以提供默认实现,指示 MapStruct 如何映射给定类型,例如:
default Collection<Integer> mapAttributes(Map<String, Integer> attributes) {
return attributes.values();
}
每当 MapStruct 尝试从 Map 映射到 Collection 时,都会调用此方法。
您可以根据需要自由定制。
关于java - 使用 Mapstruct 将 Collection 映射到 Map,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45915340/