猿问

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

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


研究:我尝试在 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<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() 中遇到编译问题。我该如何解决这个问题?


此外,任何关于这是否是在这种情况下转换列表的良好设计模式的任何建议也会很棒。


沧海一幻觉
浏览 145回答 1
1回答

潇湘沐

您需要apply创建的函数为:List<DBAnimalDTO> dbAnimals = animals.stream().map(animal -> {&nbsp; &nbsp; if (animal instanceof Dog) {&nbsp; &nbsp; &nbsp; &nbsp; return dogFunction.apply((Dog) animal);&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; return catFunction.apply((Cat) animal);&nbsp; &nbsp; }}).collect(Collectors.toList());另一方面,在DBAnimalDTO类中使用构造函数:public DBAnimalDTO(String dbName) {&nbsp; &nbsp; this.dbName = dbName;}您可以更新您的功能更清洁:Function<Dog, DBAnimalDTO> dogFunction = dog -> new DBAnimalDTO(dog.getName());Function<Cat, DBAnimalDTO> catFunction = cat -> new DBAnimalDTO(cat.getName());
随时随地看视频慕课网APP

相关分类

Java
我要回答