gpt4 book ai didi

java - 使用 Java 8 将接口(interface)类型列表转换为另一个类的列表

转载 作者:行者123 更新时间:2023-11-30 07:42:26 27 4
gpt4 key购买 nike

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

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

最佳答案

您需要应用您创建的函数:

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());

关于java - 使用 Java 8 将接口(interface)类型列表转换为另一个类的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54643680/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com