[英]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.