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

我正在寻找一种优雅的方式来处理 MapCollection 之间的映射。目前,我正在使用 @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);

该接口还包含一个映射 AttributeAttributeTO 的方法,名称为 map

是否有更优雅的方法来实现不可迭代 MapCollection 的这种转换?我的方法有效,但也有缺点。例如,重构不识别字符串中的代码片段。

默认映射器方法如何?

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

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

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

您可以根据需要自由定制它。