Java Преобразовать список <TypeA>в список <TypeB> - PullRequest
1 голос
/ 25 марта 2020

Например

class TypeA {
    private String a;
    private String b;
    private String c;
}

class TypeB {
    private String a;
}

Теперь у меня есть список TypeA, и мне нужна только информация a из TypeA. Какой самый эффективный способ конвертировать List<TypeA> в List<TypeB>

Ответы [ 2 ]

2 голосов
/ 25 марта 2020

Каким образом? С точки зрения ремонтопригодности и ясности , я голосую за библиотеки отображения объектов, такие как ModelMapper или MapStruct , которые основаны как на отражении, так и на аннотаций. В случае MapStruct вы можете определить отображение для объектов TypeA и TypeB и использовать соответствующий метод в одном и том же интерфейсе отображения.

@Mapper
public interface TypeA Mapper {

    @Mapping(target="a")
    TypeB typeAToTypeB(TypeA typeA) 

    List<TypeB> listOfTypeAToListOfTypeB(List<TypeA> list);
}

Вы всегда можете использовать простую итерацию, используя или простой for-l oop:

List<TypeB> listOfTypeB = listOfTypeA.stream()
    .map(typeA -> new TypeB(typeA.getA())
    .collect(Collectors.toList());
2 голосов
/ 25 марта 2020

Ответ зависит от того, что вы подразумеваете под «эффективным».

// Option 1
List<TypeB> bList = new ArrayList<>();
for (TypeA a : aList) {
    bList = new TypeB(s.getA());
}

// Option 2
List<TypeB> bList = aList.stream()
        .map(TypeA::getA)
        .map(TypeB::new)
        .collect(Collectors.toList());

// Option 3
List<TypeB> bList = aList.stream().map(a -> new TypeB(s.getA())).collect(toList());

Первый показывает лучший результат. Это один тип эффективности.

Второе и третье - отдельные утверждения. Это еще один тип эффективности.

...