【问题标题】:Convert List of one type to Array of another type using Dozer使用 Dozer 将一种类型的列表转换为另一种类型的数组
【发布时间】:2011-03-05 06:09:08
【问题描述】:

我想知道如何使用 Dozer 在 Java 中将一种类型的列表转换为另一种类型的数组。这两种类型具有所有相同的属性名称/类型。 例如,考虑这两个类。

public class A{
    private String test = null;

    public String getTest(){
      return this.test
    }

    public void setTest(String test){
      this.test = test;
    }
}

public class B{
    private String test = null;

    public String getTest(){
      return this.test
    }

    public void setTest(String test){
      this.test = test;
    }
}

我试过了,没有运气。

List<A> listOfA = getListofAObjects();
Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance();
B[] bs = mapper.map(listOfA, B[].class);

我也尝试过使用 CollectionUtils 类。

CollectionUtils.convertListToArray(listOfA, B.class)

两者都不适合我,谁能告诉我我做错了什么?如果我创建两个包装类,一个包含 List,另一个包含 b[],mapper.map 函数可以正常工作。见下文:

public class C{
    private List<A> items = null;

    public List<A> getItems(){
      return this.items;
    }

    public void setItems(List<A> items){
      this.items = items;
    }
}

public class D{
    private B[] items = null;

    public B[] getItems(){
      return this.items;
    }

    public void setItems(B[] items){
      this.items = items;
    }
}

这很奇怪......

List<A> listOfA = getListofAObjects();
C c = new C();
c.setItems(listOfA);
Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance();
D d = mapper.map(c, D.class);
B[] bs = d.getItems();

如何在不使用包装类 (C & D) 的情况下做我想做的事?必须有一个更简单的方法...... 谢谢!

【问题讨论】:

  • 在您最后的清单中有一个错字,映射命令应该是: D d = mapper.map(c, D.class);只是想了解您的问题和示例。

标签: java arrays list type-conversion dozer


【解决方案1】:

在开始迭代之前,您知道 listOfA 中有多少项。为什么不实例化 new B[listOfA.size()] 然后遍历 A,将新的 B 实例直接放入数组中。您将节省对 listOfB 中所有项目的额外迭代,并且代码实际上更易于阅读以启动。

Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance();

List<A> listOfA = getListofAObjects();
B[] arrayOfB = new B[listOfA.size()];

int i = 0;
for (A a : listOfA) {
    arrayOfB[i++] = mapper.map(a, B.class);
}

【讨论】:

    【解决方案2】:

    好吧,我是个白痴。我已经习惯了 Dozer 为我做所有的工作......我需要做的就是遍历 A 的列表并创建 B 的列表,然后将该列表转换为 B 的数组。

    Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance();
    List<A> listOfA = getListofAObjects();
    Iterator<A> iter = listOfA.iterator();
    List<B> listOfB = new ArrayList<B>();
    while(iter.hasNext()){
       listOfB.add(mapper.map(iter.next(), B.class));
    }
    B[] bs = listOfB.toArray(new B[listOfB.size()]);
    

    问题解决了!

    【讨论】:

      【解决方案3】:

      如果我可以编写下面的代码并且它可以工作,那将更有意义

      List<A> listOfA = getListofAObjects();
      Mapper mapper = DozerBeanMapperSingletonWrapper.getInstance();
      B[] bs = mapper.map(listOfA, B[].class);
      

      【讨论】:

      • Namrata,我在您的帖子中添加了一些空格以使其格式正确。您应该阅读格式化帮助。下次发帖时只需点击文本框旁边的“帮助”链接即可。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 2023-01-04
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      相关资源
      最近更新 更多