从具有对象列表的父对象映射对象列表

时间:2018-06-23 01:47:55

标签: java-8 mapstruct

我正在尝试使用mapstruct如下转换对象

来源

MainObject
{

    String key;
    List<ChildObject> children;
}

ChildObject{

    String childVar1;
    String childVar2;

}

目标

List<TargetObj> targetObjects;

TargetObj{

    String key;
    String var1;
    String var2;

}

我需要准备一个TargetObj实例的列表,其中的键是从MainObject的键映射而来的,而从ChildObject的映射是var1和var2。 我试图使用mapstruct文档中提到的ObjectFactory和Decorator。但是找不到解决方案。两种情况下,我都收到一个错误,指出无法从非迭代参数返回可迭代对象。

2 个答案:

答案 0 :(得分:1)

您可以像这样使用Java8解决它,

List<TargetObj> targets = Stream.of(mainObject)
        .flatMap(mo -> mo.getChildren().stream()
                .map(c -> new TargetObj(mo.getKey(), c.getChildVar1(), c.getChildVar2())))
        .collect(Collectors.toList());

答案 1 :(得分:0)

您可以尝试将@BeforeMapping@AfterMapping@Context结合使用。

您的映射器可能如下所示:

@Mapper
public interface MyMapper {

    default List<TargetObj> map(MainObject source) {
        if (source == null) {
            return Collections.emptyList(); // or null or whatever you prefer 
        }
        return map(source.getChildren(), new CustomContext(source));
    }

    List<TargetObject> map(List<ChildObject> children, @Context CustomContext context);

    @Mapping(target = "key", ignore = true) // key is mapped in the context
    TargetObject map(ChildObject child, @Context CustomContext context);
}

自定义上下文如下所示:

public class CustomContext {

    protected final MainObject mainObject;

    public CustomContext(MainObject mainObject) {
        this.mainObject = mainObject;
    }

    @AfterMapping // of @BeforeMapping
    public void afterChild(@MappingTarget ChildObject child) {
        child.setKey(mainObject.getKey());
        // More complex mappings if needed
    }
}

目标是通过使用MapStruct将生成的其他方法,将您的MainObjectList<TargetObj>进行手动映射