Преобразование списка типов интерфейса в список другого класса с использованием Java 8 - PullRequest
0 голосов
/ 12 февраля 2019

Проблема: у меня есть список типа интерфейса, который мне нужно преобразовать в список базы данных DTO перед сохранением в базе данных.Я новичок в потоках и функциях Java 8, поэтому любая помощь будет полезна.

Исследование: я пытался использовать instanceOf в карте, но всегда получаю ошибки компиляции.

Ниже приведены различные классы и их иерархия.

public interface Animal {}

Public Class Cat implements Animal{
    private String name;
    public void getName() {
        return name;
    }
}

Public Class Dog implements Animal{
    private String name;
    public void getName() {
        return name;
    }
}

Public Class DBAnimalDTO{
    private String dbName;
    public void setDbName(String name) {
        this.dbName = name;
    }
}

Чтобы отобразить классы Dog и Cat, я создал отдельные функции.

Function<Dog, DBAnimalDTO> dogFunction = dog -> {
    DBAnimalDTO dbAnimalDTO = new DBAnimalDTO();
    dbAnimalDTO.setDbName(dog.getName());
    return dbAnimalDTO;
}
Function<Cat, DBAnimalDTO> catFunction = cat -> {
    DBAnimalDTO dbAnimalDTO = new DBAnimalDTO();
    dbAnimalDTO.setDbName(cat.getName());
    return dbAnimalDTO;
}

Используя потоки, которые я пробовалиспользовать различные функции карты в зависимости от типа объекта.

List<Animal> animals = new ArrayList();

List<DBAnimalDTO> dbAnimals = animals.stream().map(animal -> {
    if(animal instanceOf Dog) {
        return dogFunction;
    } else {
        return catFunction;
    }
}).collect(Collectors.<DBAnimalDTO> toList());

Я всегда получаю проблему компиляции в Collectors.toList ().Как мне решить эту проблему?

Кроме того, любой совет, если это хороший шаблон проектирования для преобразования списка в этом сценарии, также был бы полезен.

1 Ответ

0 голосов
/ 12 февраля 2019

Вам необходимо apply функцию, которую вы создали как:

List<DBAnimalDTO> dbAnimals = animals.stream().map(animal -> {
    if (animal instanceof Dog) {
        return dogFunction.apply((Dog) animal);
    } else {
        return catFunction.apply((Cat) animal);
    }
}).collect(Collectors.toList());

С другой стороны, используя конструктор в классе DBAnimalDTO как:

public DBAnimalDTO(String dbName) {
    this.dbName = dbName;
}

Вы можете обновить свои функции, чтобы сделать их более понятными:

Function<Dog, DBAnimalDTO> dogFunction = dog -> new DBAnimalDTO(dog.getName());
Function<Cat, DBAnimalDTO> catFunction = cat -> new DBAnimalDTO(cat.getName());
...