Преобразование списка одного типа в массив другого типа с помощью Dozer - PullRequest
2 голосов
/ 18 июня 2010

Мне интересно, как преобразовать Список одного типа в массив другого типа в Java с помощью Dozer.Два типа имеют одинаковые имена / типы свойств.Например, рассмотрим эти два класса.

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)

Никто не работает на меня, кто-нибудь может сказать мне, что я делаю неправильно?Функция mapper.map работает нормально, если я создаю два класса-обертки, один из которых содержит список, а другой - ab [].См. Ниже:

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)?Должен быть более легкий путь ... Спасибо!

Ответы [ 3 ]

3 голосов
/ 21 июня 2010

Вы знаете, сколько элементов в listOfA, прежде чем начать итерацию.Почему бы не создать экземпляр нового 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);
}
1 голос
/ 18 июня 2010

Хорошо, так что я идиот.Я слишком привык к тому, что Дозер делал всю работу за меня ... Все, что мне нужно было сделать, это перебрать список А и создать список Б, а затем преобразовать этот список в массив Б.

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()]);

Проблема решена!

0 голосов
/ 06 мая 2011

Будет больше смысла, если я смогу написать код ниже, и он работает

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