我有一个像这样的对象:
@Data
@AllArgsConstructor
@NoArgsConstructor
class Person {
private String name;
private String lastName;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class DBPerson {
private String name;
private String lastName;
}
List<DBPerson> dbPersons = new ArrayList();
dbPersons.add(new DBPerson("Harry", "Potter"));
dbPersons.add(new DBPerson("Hermione", "Granger"));
dbPersons.add(new DBPerson("Ronald", "Weasley"));
我需要从列表
转换为列表
,所以我尝试了以下方法:
dbPersons.stream()
.map(DBPerson::getName)
.map(Person::new)
.collect(Collectors.toList());
这显然是在new
上给了我一个错误,因为在person
类上没有具有单个string
的构造函数
如何映射dbperson
的两个属性来创建新的person
,然后将所有这些属性收集到列表
我发现了使用
FlatMap
的其他解决方案,但这些解决方案用于将name
和lastname
连接到一个字符串
,这不是我想要的。
向第二个类添加一个构造函数,该构造函数接受第一个类类型的参数。将stream#map
与该构造函数的方法引用一起使用,并收集第二个类的新实例。
personXes.stream().map( PersonY :: new ).toList();
与其为getter使用方法引用,不如编写一个lambda函数来生成一个新对象。
为了简洁起见,让我们使用Java16+records特性。
package work.basil.mix;
public record PersonX( String firstName , String lastName ) { }
package work.basil.mix;
public record PersonY( String firstName , String lastName ) { }
List < PersonX > xList =
List.of(
new PersonX( "Harry" , "Potter" ) ,
new PersonX( "Hermione" , "Granger" ) ,
new PersonX( "Ronald" , "Weasley" )
);
List < PersonY > yList = xList.stream().map( personX -> new PersonY( personX.firstName() , personX.lastName() ) ).toList() ;
在备用格式中。
List < PersonY > yList =
xList
.stream()
.map(
personX -> new PersonY( personX.firstName() , personX.lastName() )
)
.toList();
跑的时候。
yList=[人格[第一名=哈利,第一名=波特],人格[第一名=赫敏,第一名=格兰杰],人格[第一名=罗纳德,第一名=韦斯莱]]
package work.basil.mix;
public record PersonY( String firstName , String lastName ) {
public PersonY ( PersonX personX ) {
this( personX.firstName() , personX.lastName() );
}
}
List < PersonY > yList = xList.stream().map( personX -> new PersonY( personX ) ).toList();
我们可以通过使用构造函数的方法引用来进一步简化:persony::new
。每个personx
对象都将隐式传递给构造函数。
下一行代码的工作原理与上面的代码完全相同,只是更短,而不是更好。在这两种情况下,第一个类的每个流对象都被传递给第二个类的构造函数。
List < PersonY > yList = xList.stream().map( PersonY :: new ).toList();
假设我们有一个这样定义的对象A: 出于某种原因,我需要创建第二个对象B,它只具有对象A的前两个属性: 所以我的问题是:将对象A复制到对象B的最佳方法是什么?我一直在逐个复制获取者和设置者的属性,但有些事情告诉我一定有更好的方法来做到这一点!特别是当对象将具有很多属性时,我必须编写一行又一行的代码,只是为了将它们全部复制到第二个对象B... 多谢了:) 编辑:我一直被一个“另一个问题的可能重复”提醒
问题内容: 我的ViewValue类定义如下: 在我的代码中,我需要将ViewValue实例列表转换为包含来自相应ViewValue的id字段值的列表。 我用foreach循环来做: } 有没有更好的方法来解决这个问题? 问题答案: 编辑:此答案基于以下想法:您需要对代码中其他位置的不同实体和不同属性执行类似的操作。如果您 只需 要按ID将ViewValues列表转换为Longs列表,则请坚持使用
当遍历ACROD时,有一个列表,并希望将该列表中的第一个对象映射到我的域对象。 @mapping(source=“insurancesvcrqs[0].policyquoteinqrqsaddrqsandpolicyquoteinqrqs[0].productues[0].generalpartyinfo.nameinfos[0].commlname.commericalname”,target=
尝试使用mapstruct将两个列表映射到另一个列表时遇到问题。结构如下: 我需要将来自类C和类B的列表映射到类A中的列表(从对象B和对象C到对象A的映射已经完成)。我尝试了以下方法: 这给我带来了编译错误。有人能帮我映射这些列表吗?我听说过一个名为异常的注释参数,但无法解决我的问题。 谢谢
通过聚合和分组将一个对象映射到另一个对象 ToQ的输出应为 我尝试使用分组函数,但它生成了HashMap但不确定如何转换为对象。
我有Object1和Object2。现在,我想映射对象3,属性来自1 比方说,我有两个目标: 现在,有了这些,我想把它映射进去 哪里,first_name 现在,我的问题是,怎么做? 然而,目前,我正在这样做 但是,在这里,我必须在addressToView()中手动编写映射。 因此,有没有办法避免这种情况? 或者,处理此类情况的首选方式是什么?