使用Java 8将接口类型的列表转换为另一个类的列表

时间:2019-02-12 05:59:19

标签: java java-8 functional-programming java-stream

问题:我有一个接口类型列表,在存储到数据库之前,我需要将其转换为数据库DTO列表。 我是Java 8流和Map函数的新手,所以任何帮助都会很棒。

研究:我试图在map中使用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。

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 :(得分:3)

您需要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());