使用Mapstruct将集合映射到Map并反之亦然

时间:2017-08-28 09:02:05

标签: java mapping dto mapstruct

我使用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;
}

我正在寻找一种优雅的方法来处理MapCollection之间的映射。目前,我正在使用expression注释的@Mapping属性。自从Attribute引用Test后,我使用了来自&#34;映射的CycleBreakingContext与周期&#34;示例

@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

是否有更优雅的方式来实现非可迭代MapCollection的转换?我的方法很有效,但有其不足之处。例如,重构无法识别字符串中的代码片段。

1 个答案:

答案 0 :(得分:1)

默认映射器方法怎么样?

在mapper界面中,您可以提供指示MapStruct如何映射给定类型的默认实现,例如:

default Collection<Integer> mapAttributes(Map<String, Integer> attributes) {
    return attributes.values();
}

只要MapStruct尝试从Map映射到Collection,就会调用此方法。

您可以随意自定义它。