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

将具有多个属性的对象映射到另一个对象,然后收集以列出

闽焕
2023-03-14

我有一个像这样的对象:

@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的其他解决方案,但这些解决方案用于将namelastname连接到一个字符串,这不是我想要的。


共有1个答案

訾安邦
2023-03-14

向第二个类添加一个构造函数,该构造函数接受第一个类类型的参数。将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()中手动编写映射。 因此,有没有办法避免这种情况? 或者,处理此类情况的首选方式是什么?