【发布时间】:2021-08-13 22:57:12
【问题描述】:
我有一个像这样的对象:
@Data
@AllArgsConstructor
@NoArgsConstructor
class Person {
private String name;
private String lastName;
}
还有一个,我们称之为:
@Data
@AllArgsConstructor
@NoArgsConstructor
class DBPerson {
private String name;
private String lastName;
}
假设两个对象都有一个带有name 和lastName 的构造函数以及它们各自的getter 和setter,我使用的是lombok
List<DBPerson> dbPersons = new ArrayList();
dbPersons.add(new DBPerson("Harry", "Potter"));
dbPersons.add(new DBPerson("Hermione", "Granger"));
dbPersons.add(new DBPerson("Ronald", "Weasley"));
我需要从List<DBPerson> 转换为List<Person>,所以我尝试了这种方式:
dbPersons.stream()
.map(DBPerson::getName)
.map(Person::new)
.collect(Collectors.toList());
这显然在 new 上给了我一个错误,因为在 Person 类上没有带有单个 String 的构造函数
如何映射DBPerson 的两个属性以创建新的Person,然后将所有这些属性收集到List<Person> 中?
我已尝试使用 .forEach,但我不确定这是否是最佳解决方案,因此如果有另一种使用 Stream API 的方法,我将不胜感激任何更好的解决方案,否则我将拥有坚持.forEach。
我找到了使用flatMap 的其他解决方案,但这些解决方案用于将name 和lastName 连接成一个String,这不是我想要的。
【问题讨论】:
-
你需要一个普通的 lambda:
dbPerson -> new Person(dbPerson.getName(), dbPerson.getLastName()) -
或者你可以创建一个构造函数
Person(DBPerson dbPerson)和映射Person::new。 -
您的意思是在带有常规 lambda 的
.forEach循环内吗? @shmosel 喜欢dbPersons.forEach(dbPerson -> new Person(...))? -
不,那在
map()里面。 -
知道了,确实做到了,如果你能把它写成答案,我很乐意接受它
标签: java java-8 java-stream