用于数据转换的Java函数与Spring转换器

用于数据转换的Java函数与Spring转换器,java,spring,lambda,Java,Spring,Lambda,我在查看几个月前编写的一些代码时,偶然发现一些服务类正在执行以下操作: 查询DB并获取实体列表(为了方便起见,我们考虑它们人>代码>实体)。 对查询的列表进行流式处理,并将检索到的数据转换为PersonDtotransfer对象的列表 现在,对于步骤2,使用自定义弹簧转换器执行从a型(Person)到B型(PersonDto)的转换 现在我的问题如下。可以使用类似的java.util.函数而不是弹簧转换器来执行相同的精确操作。那么,用它来代替这种方法有什么好处呢 我查看了文档,除了提到任何Spr

我在查看几个月前编写的一些代码时,偶然发现一些服务类正在执行以下操作:

查询DB并获取实体列表(为了方便起见,我们考虑它们<代码>人>代码>实体)。
  • 对查询的列表进行流式处理,并将检索到的数据转换为
    PersonDto
    transfer对象的列表
  • 现在,对于步骤2,使用自定义弹簧转换器执行从a型(
    Person
    )到B型(
    PersonDto
    )的转换

    现在我的问题如下。可以使用类似的
    java.util.
    函数而不是弹簧转换器来执行相同的精确操作。那么,用它来代替这种方法有什么好处呢

    我查看了文档,除了提到任何SpringConverter实现都是线程安全的之外,我没有看到任何其他明显的区别

    我倾向于大量使用Spring转换器,因为我能够在不同的地方注入它们并重用它们,但我认为对于包含自执行lambda函数的服务类也可以这样做


    如上所述,与普通功能相比,使用Spring转换器可能有哪些优点/缺点。

    当您将转换器注册到Spring容器时,Spring能够为您自动转换值。

    根据您的使用情况,可能没有任何优点/缺点。转换器部分是在Spring3中实现的,支持Java5(和Java6),因此没有
    函数

    但重要的是,转换器功能是Spring的一部分。虽然可以轻松调用函数,但Spring对此一无所知。Spring确实了解自己的转换器,因此您可以编写转换器,使整个Spring框架能够理解如何将
    A
    转换为
    B
    ,其中
    A
    是Spring不理解的,而
    B
    是Spring所做的。在某些特殊情况下可能需要这样做,即使最常见的用例已经为您编写好了


    所以Spring的转换器功能主要不是转换数据,而是扩展Spring框架本身的功能。使用它自己手动转换数据比实际用例更具副作用。

    第三种选择是,有一个名为MapStruct的Java库,旨在消除手动创建这些转换器的样板:这是一个很好的答案,但仍然忽略了我最初的问题。由于转换器现在是有效的功能接口,我不明白为什么在各种情况下不使用它进行数据转换。我知道转换器也可以用于其他用途(在一般上下文中注册等),但我最感兴趣的是这种情况下的用法比较。我的主要问题是技术上的问题,有什么不同吗?@Aris你问了不同,我告诉了他们。不,在
    函数
    转换器
    之间没有其他主要区别,除了默认方法外,接口是相同的。当然,找到
    Converter
    接口的实现者要比找到转换器函数容易得多,因此如果您的项目已经在使用
    Converter
    ,切换到
    函数
    对您没有任何好处。我感觉您在这个完全不相关的选择中寻找更深的意义。是不是因为你认为<代码>功能<代码>更新,因此更先进和“更好”?确实如此。我更倾向于看一种方法和另一种方法之间是否存在任何潜在的技术影响。在我的回答中讨论了实际的技术影响,如果忽略这些,就没有区别。您可以将相同的lambda分配给
    函数
    转换器
    。无论你用哪一个都没有区别。