繁体   English   中英

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

[英]Convert list of interface type to list of another class using Java 8

问题:我有一个接口类型的列表,在存储到数据库之前,我需要将其转换为数据库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()中遇到编译问题。 我该如何解决这个问题?

同样,在这种情况下,如果这是一种转换列表的良好设计模式,那么任何建议也都很棒。

您需要apply创建的函数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());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM