使用 Mapstruct 将 Collection 映射到 Map,反之亦然
Mapping a Collection to Map and vise versa with Mapstruct
我正在使用 Mapstruct 来处理将一个 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
,因此我使用 "mapping with cycles" 示例中的 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 尝试从 Map 映射到 Collection,就会调用此方法。
您可以根据需要自由定制它。
我正在使用 Mapstruct 来处理将一个 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
,因此我使用 "mapping with cycles" 示例中的 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 尝试从 Map 映射到 Collection,就会调用此方法。
您可以根据需要自由定制它。