2017-02-14 2 views
1

У меня есть два объекта, которые разделяют те же поля: Livre и LivreVO.Копировать содержимое ArrayList в другой с другим объектом

Как скопировать содержимое List<Livre> в List<LivreVO>?

Например:

List<Livre> liste = service.getListeLivre(); 
List<LivreVO> listeVO = new ArrayList<LivreVO>(liste); 
+3

Вы не можете, если оба класса не имеют общего супертипа. –

+0

@ Константин Йоков. Даже если у них одинаковые поля? –

+2

Java не поддерживает утиную типизацию формы или формы. –

ответ

4

Если два класса Livre и Livre0 не разделяет общие супер -тип; вы не можете (легко).

Что вы можете сделать:

List<Livre0> listeV0 = new ArrayList<>(); 
for (Livre livre : service.getListeLivre()) { 
    Livre0 copy = new LivreV0(...); 
    listeV0.add(copy); 
} 

Другими словами: вы должны создать новые объекты; и как, это зависит от ваших существующих классов. A разумный подход может заключаться в том, чтобы иметь конструктор в пределах LivreV0, который принимает объект Livre; и извлекает все соответствующие свойства оттуда.

Худший случай, возможно, вы захотите изучить отражение. Это позволит вам в основном запросить все поля в Livre-Object; и использовать эту информацию для перевода значений в одинаково названные поля в Livre0-Object. Работы, но громоздкие и подверженные ошибкам.

И: возможно, также стоит отступать здесь. В одиночку идея иметь два разных классов, у которых есть одинаковые поля ... звучит как дизайн проблема. Таким образом, реальным ответом может быть переосмыслить вашу объектную модель. Вероятно, у вас должен быть класс , который содержит все те свойства, которые должны быть общий для Livre и Livre0. Значение: вместо дублируя всю эту информацию, вы нажимаете эти данные в Common объектов; а затем ваши объекты Livre и Livre0 «указывают» на объект Common.

+0

вот что я делал, но что, если есть много полей ... –

+1

@kh.а затем, возможно, узнать о наследовании и прекратить копирование вставки классов с одинаковыми полями ?! –

+0

Спасибо, я понимаю сейчас –

0

Вам нужен какой-то механизм для преобразования Livre в LivreVO, то сделать что-то вроде этого:

List<LivreVO> listeVO = new ArrayList<>(); 
for (Livre l: service.getListeLivre()) { 
    listVo.add(convert(l)); 
} 
1

Допустим, что существует LivreVO конструктор, который принимает Livre:

LivreVO(Livre object){ 
    // copy common fields. 
} 

Теперь мы можем превратить List<Livre> liste в List<LivreVO> listeVO:

List<LivreVO> listeVO = liste.stream().map(LivreVO::new). 
           collect(Collectores.toList()); 

Или вы можете просто создать новые LivreVO объекты и заполнить их вручную :

List<LivreVO> listeVO = liste.stream().map(livre -> { 
          LivreVo tmp = new LivreVo(); 
          tmp.setCommonField(livre.getCommonField()); 
          //... 
          retrun tmp; 
         }).collect(Collectores.toList()); 
Смежные вопросы