Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中从一种类型转换为另一种类型的简单方法(当字段相似时)?_Java_Java 8 - Fatal编程技术网

java中从一种类型转换为另一种类型的简单方法(当字段相似时)?

java中从一种类型转换为另一种类型的简单方法(当字段相似时)?,java,java-8,Java,Java 8,假设我有两门课: class A { String firstA; List<String> secondA; } class B { String firstB; List<String> secondB; } A类{ 第一串; 第二名单a; } B类{ 字符串firstB; 名单b; } 有没有一种简单的方法可以轻松地从A转换为B?不必为每个字段手动执行此操作?我认为本机java无法做到这一点 有一些库可以帮助您解决此类问题 我推荐M

假设我有两门课:

class A {
    String firstA;
    List<String> secondA;
}

class B {
   String firstB;
   List<String> secondB;
}
A类{
第一串;
第二名单a;
}
B类{
字符串firstB;
名单b;
}

有没有一种简单的方法可以轻松地从A转换为B?不必为每个字段手动执行此操作?

我认为本机java无法做到这一点

有一些库可以帮助您解决此类问题

我推荐MapStruct:
我还使用了Orika和ModelMapper。

我认为原生java无法做到这一点

有一些库可以帮助您解决此类问题

我推荐MapStruct:
我还使用了Orika和ModelMapper。

为此,您可以使用反射

查看java.lang.reflect,获取每个字段的A.class和循环,以复制值


你可以使用反射来达到这个目的

查看java.lang.reflect,获取每个字段的A.class和循环,以复制值


您可以在Java库中使用ModelMapper

您可以在Java库中使用ModelMapper

简短回答 在纯Java中,不需要逐个复制字段,就无法将A类型的对象转换为B类型的对象


更长的答案
这是为什么?

Java
中没有类似的字段。设计的
Java
语言不支持。因此,您不能按名称将两个字段视为类似的

我怎样才能完成它?

有不同的方法:

  • 手动映射
这是一种枯燥但运行时性能良好的方法

  • 继承
    多态
不是真正的映射方法,而是通过其公共接口
和/或
父类`,将对象视为相似的

  • 序列化反序列化到/从
    字符串
如果这两种类型的字段具有相同的名称和类型,则可以通过序列化/反序列化(例如)将它们从一个字段映射到另一个字段。这不是最好的解决方案,但在某些罕见的情况下可能会起到很好的作用

  • 使用基于
    反射的库和
    反射的库
反思是实现同样目标的另一种方式,但有着巨大的权衡。 这种方法与上面的方法没有太大区别,但它允许映射具有不同名称的字段。尽管该方法被广泛使用(例如在中),但其性能不是很好。反射操作可能需要很长时间

  • 使用代码生成器
还有另一种方法。与在运行时使用反射相反,代码生成器(如)在编译时执行类似的操作。因此,与手动映射相比,没有运行时开销。实际上,生成的代码看起来与手动编写的代码一样安静

如何为我的项目选择一个?

有许多不同的工具用于在彼此之间映射POJO类型。 在选择其中一个用于您的项目之前,我建议考虑以下标准:

  • 这种特殊情况是否值得添加外部依赖关系
  • 它容易阅读吗
  • 在不破坏代码的情况下修改类容易吗
  • 它是否在运行时执行
  • 等等
主观意见:

我个人喜欢使用MapStruct。它在编译时生成映射的方法,因此不存在导致开销的运行时反射内容。您几乎可以零成本映射对象。

简短回答 在纯Java中,不需要逐个复制字段,就无法将A类型的对象转换为B类型的对象


更长的答案
这是为什么?

Java
中没有类似的字段。设计的
Java
语言不支持。因此,您不能按名称将两个字段视为类似的

我怎样才能完成它?

有不同的方法:

  • 手动映射
这是一种枯燥但运行时性能良好的方法

  • 继承
    多态
不是真正的映射方法,而是通过其公共接口
和/或
父类`,将对象视为相似的

  • 序列化反序列化到/从
    字符串
如果这两种类型的字段具有相同的名称和类型,则可以通过序列化/反序列化(例如)将它们从一个字段映射到另一个字段。这不是最好的解决方案,但在某些罕见的情况下可能会起到很好的作用

  • 使用基于
    反射的库和
    反射的库
反思是实现同样目标的另一种方式,但有着巨大的权衡。 这种方法与上面的方法没有太大区别,但它允许映射具有不同名称的字段。尽管该方法被广泛使用(例如在中),但其性能不是很好。反射操作可能需要很长时间

  • 使用代码生成器
还有另一种方法。与在运行时使用反射相反,代码生成器(如)在编译时执行类似的操作。因此,与手动映射相比,没有运行时开销。实际上,生成的代码看起来与手动编写的代码一样安静

如何为我的客户选择一个
// warning: not tested nor compiled -take it as hint

A a = new A(); ...set values
B b = new B();
for (Field f : A.class.getFields()) {
    f.set(b,f.get(a);
}