问题:我有一个接口类型列表,在存储到数据库之前,我需要将其转换为数据库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()中遇到编译问题。 我该如何解决这个问题?
此外,在这种情况下,如果这是一种转换列表的良好设计模式,那么任何建议也都很棒。
答案 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());