将集合映射到Map并反之亦然使用Mapstruct
问题描述:
我正在使用Mapstruct来处理将一个POJO映射到另一个POJO的样板代码。将集合映射到Map并反之亦然使用Mapstruct
这里是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);
该接口还包含方法映射到Attribute
与AttributeTO
名称map
。
是否有一种更优雅的方式来实现非迭代Map
到Collection
的转换?我的方法正在工作,但有缺点。例如,重构不能识别字符串中的代码片段。
答
默认的映射器方法如何?
在你的映射器接口可以提供默认的实现就如何映射给定类型,例如指示MapStruct:
default Collection<Integer> mapAttributes(Map<String, Integer> attributes) {
return attributes.values();
}
每当MapStruct试图映射从地图收藏此方法将被调用。
您可以*定制它,只要你想。
如果我将此添加到我的接口,在编译期间出现以下错误:无法生成从非可迭代类型到可迭代类型的映射方法。 –
这很奇怪,你确定要用'default'关键字添加它吗?使用'default'的替代方法是使用util类和静态方法(如果映射是无状态的话)。 – Filip
感谢您的回答!我在界面中使用了错误。我的错......这种方法是正确的方法。 –