当前位置: 首页 > 知识库问答 >
问题:

目标列表迭代映射结构

仇炜
2023-03-14

我正在使用mapstruct并尝试映射2种不同类型的对象。这是要求。
目标对象结构如下(层次结构)

List<Object1>
Object1 have List<Object2>
Object 2 have List<Object3>
Object 3 have List<Object4>

并且每个都有要从源映射的字符串对象,分别是ListObject和StringObject

SourceObject在同一个类中:

List<SourceObject1>
List<SourceObject2>
List<SourceOject3>

映射要求为:

Object1 have to map with SourceObject1
Object2 have to map with SourceObject2
Object3 have to map with SourceObject3

我正在使用1.2.0。最终版本和能够映射Object1的版本必须与SourceObject1映射

//List to List mapping
@Mapping(target = "Object1", source = "SourceObject1")
Target from(Source);
@Mapping(target = "Object1[0].Object2", source = "SourceObject2") 
Mapping(target = "Object1[0].Object3", source = "SourceObject3") 
//not casting and not mapping working.Also Need to map String fields under 
list Object.

共有1个答案

商曦
2023-03-14

这很简单,你只需要让mapstruct发挥它的魔力!一个简单的例子:

目标类:

public class Object1 {
    private List<Object2> list;

    public List<Object2> getList() {
        return list;
    }

    public void setList(List<Object2> list) {
        this.list = list;
    }
}

public class Object2 {
    private List<Object3> list;

    public List<Object3> getList() {
        return list;
    }

    public void setList(List<Object3> list) {
        this.list = list;
    }
}

public class Object3 {
    private List<Object4> list;

    public List<Object4> getList() {
        return list;
    }

    public void setList(List<Object4> list) {
        this.list = list;
    }
}

public class Object4 {
    private String field;

    public String getField() {
        return field;
    }

    public void setField(String field) {
        this.field = field;
    }
}

源类:

public class SourceObject1 {
    private List<SourceObject2> list;

    public List<SourceObject2> getList() {
        return list;
    }

    public void setList(List<SourceObject2> list) {
        this.list = list;
    }
}

public class SourceObject2 {
    private List<SourceObject3> list;

    public List<SourceObject3> getList() {
        return list;
    }

    public void setList(List<SourceObject3> list) {
        this.list = list;
    }       
}

public class SourceObject3 {
    private List<SourceObject4> list;

    public List<SourceObject4> getList() {
        return list;
    }

    public void setList(List<SourceObject4> list) {
        this.list = list;
    }
}

public class SourceObject4 {
    private String field;

    public String getField() {
        return field;
    }

    public void setField(String field) {
        this.field = field;
    }
}

地图绘制者的定义:

@Mapper
public interface  MapperExample {

    Object1 map(SourceObject1 source);

    Object2 map(SourceObject2 source);

    Object3 map(SourceObject3 source);

    Object4 map(SourceObject4 source);
}

生成的代码:

@Override
public Object1 map(SourceObject1 source) {
    if ( source == null ) {
        return null;
    }

    Object1 object1 = new Object1();

    object1.setList( sourceObject2ListToObject2List( source.getList() ) );

    return object1;
}

@Override
public Object2 map(SourceObject2 source) {
    if ( source == null ) {
        return null;
    }

    Object2 object2 = new Object2();

    object2.setList( sourceObject3ListToObject3List( source.getList() ) );

    return object2;
}

@Override
public Object3 map(SourceObject3 source) {
    if ( source == null ) {
        return null;
    }

    Object3 object3 = new Object3();

    object3.setList( sourceObject4ListToObject4List( source.getList() ) );

    return object3;
}

@Override
public Object4 map(SourceObject4 source) {
    if ( source == null ) {
        return null;
    }

    Object4 object4 = new Object4();

    object4.setField( source.getField() );

    return object4;
}

protected List<Object2> sourceObject2ListToObject2List(List<SourceObject2> list) {
    if ( list == null ) {
        return null;
    }

    List<Object2> list1 = new ArrayList<Object2>( list.size() );
    for ( SourceObject2 sourceObject2 : list ) {
        list1.add( map( sourceObject2 ) );
    }

    return list1;
}

protected List<Object3> sourceObject3ListToObject3List(List<SourceObject3> list) {
    if ( list == null ) {
        return null;
    }

    List<Object3> list1 = new ArrayList<Object3>( list.size() );
    for ( SourceObject3 sourceObject3 : list ) {
        list1.add( map( sourceObject3 ) );
    }

    return list1;
}

protected List<Object4> sourceObject4ListToObject4List(List<SourceObject4> list) {
    if ( list == null ) {
        return null;
    }

    List<Object4> list1 = new ArrayList<Object4>( list.size() );
    for ( SourceObject4 sourceObject4 : list ) {
        list1.add( map( sourceObject4 ) );
    }

    return list1;
}
 类似资料:
  • 我在迭代一个对象内的列表时遇到了一个问题,该对象内嵌在另一个映射中。我的目标是迭代这个列表并生成一个映射 ,我希望使用streams和lamdas来实现这一点。 我在上面看到了,我需要通过迭代FolderBo中的elementList从elementBo创建一个带有map 的映射。folderBo本身就在Modelbo的地图内。

  • 我有两份清单: 列表1: Object1(name1, id1) 列表2: Object2(name2, id2) 给定list1的大小与list2相同 我想迭代list2,如果list2的name2不为null,则更新list1的name1。 以下是使用旧java的代码: 用java实现这一点的最佳方法是什么。util。流动

  • 本文向大家介绍C++映射迭代器,包括了C++映射迭代器的使用技巧和注意事项,需要的朋友参考一下 示例 容器中第一个元素的迭代器。 如果映射对象是const限定符,则该函数返回const_iterator。否则,返回iterator。 输出: a => 200 b => 100 c => 300

  • 我有一个a类和B类的列表,没有重复的元素。“代码”属性在A类和B类中都是相同的。我想将它们转换为Map 最终映射的顺序应与列表1中的元素相同 ~A 更新:我将代码更新到下面,但它不是编译的。你知道怎么了吗?

  • 的默认行为 mapper() 在映射的 Table 到映射的对象属性中,每个属性都根据列本身的名称命名(特别是 key 属性 Column )这种行为可以通过几种方式进行修改。 从属性名称清楚地命名列 默认情况下,映射与 Column 与映射属性的相同-具体来说,它与 Column.key 属性对 Column ,默认与 Column.name . 指定给映射到的python属性的名称 Colum

  • 如何使用MapStruct映射嵌套列表? 下面是我的实体类: 我想把它映射到: 现在,我的映射器看起来像: 但它只映射“普通”属性,如Long、intger等,但它避免了嵌套列表。