当前位置: 首页 > 知识库问答 >
问题:

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

劳高爽
2023-03-14

问题:我有一个接口类型列表,在存储到数据库之前需要将其转换为数据库DTO列表。我不熟悉Java8流和映射函数,所以任何帮助都会很好。

研究:我试图在映射中使用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;
}

使用streams,我尝试根据对象类型使用不同的映射函数。

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.to列表()编译问题。我如何解决这个问题?

此外,任何关于这是否是一个很好的设计模式来转换此场景中的列表的建议都将非常有用。

共有1个答案

戴靖
2023-03-14

您需要应用创建为以下内容的函数:

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

 类似资料:
  • 鉴于 我有一个对象列表。 看起来像 我想将此转换为 i、 e.将个人类别整理成类别列表。 这是实现我想要的当前代码。 有什么方法可以使用流来做到这一点吗 这个问题在本质上类似于Group by和sum对象,比如SQLJavalambdas?但对我没有帮助,因为这里完成了聚合,而这里不是聚合。

  • 问题内容: 例如,假设你有两个类: 我有一个返回a的方法,List 并且我想将列表中的所有对象都强制转换为,TestB以便最终得到 问题答案: 简单地铸造几乎可行;但这是行不通的,因为你不能将一个参数的泛型类型转换为另一个参数。但是,你可以强制转换中间通配符类型,并且将允许它(因为你可以强制转换为通配符类型或从通配符类型强制转换,只是带有未选中的警告):

  • 我试图创建动态下拉,其值是从使用微服务的查找表之一填充,但我已经尝试了许多方式相同,到目前为止,我还没有成功地使其工作。 下面的代码用于调用webservice 这是我的对象类型 仅用于显示目前运行的以下代码 我做了什么我尝试调用webservice在多种方式调用它,尝试铸造服务响应直接使用JSON字符串响应和可能的事情我尝试过。 你能在这里帮忙吗?我们将不胜感激。

  • 如何使用stream转换下面的代码而不使用for each循环。 getAllSubjects()返回所有列表,每个主题都有。所有列表应合并为。 需要从中获取 对象模型:

  • 问题内容: 我想使用Java 8技巧在一行中执行以下操作。 给定此对象定义: 和a ,我想得到a ,它是第一个列表中所有s对象的列表- 顺序相同。 我可以使用Java中的循环来做到这一点,但我相信Java8中应该有一个单行lambda可以做到这一点。我无法在线找到解决方案。也许我没有使用正确的搜索词。 有人可以为这种转换建议一个lambda或另一种线吗? 问题答案: 这应该可以解决问题: 也就是说

  • 我可以在Java中使用循环来实现这一点,但我认为在Java8中应该有一个一行程序lambda来实现这一点。我无法在网上找到解决方案。也许我没有使用正确的搜索词。 有人能为这个转换提出一个lambda或另一个一行程序吗?