我有一个实体类
public class User {
private String name;
private List<String> adress;
// gertters and setters
}
基本上,上面的类给出了按用户名分组的地址列表
我需要在class User
中转换class User2
。看:
public clas User2 {
private String name;
private String address;
}
具有五个地址的用户对象将生成五个User2对象。
如果有一个User列表,有没有办法用一个Java 8 Lambda表达式来做到这一点?
我试图做
userList.stream().reduce( ?????? ).collect(Collectors.toList());
答案 0 :(得分:3)
我能想出的最好的结果:
userList.stream().<User2> flatMap(
user -> user
.getAddress()
.stream()
.map(address -> new User2(user.getName(),
address))).collect(Collectors.toList());
使用flatMap
将流转换为更多元素,并将每个地图都指向具有给定名称的新User2
,并将其转换为列表。不得不使用<User2>
来强制List<User2>
,这可以通过将flatMap
lambda与其泛型一起存储来避免。
此外,添加了一些由代码片段隐含的getter和构造函数。我的完整代码位于https://gist.github.com/kenzierocks/59685c564447b106f069。
答案 1 :(得分:0)
我已经建立了一个库来使代码更优雅:
https://github.com/wapatesh/fig
使用此库,代码可以是:
public class User {
private String name;
private Seq<String> address; // need to change to seq to make best code
}
Seq<User> user = ...;
Seq<User2> result = user.flatMap(u -> u.getAddress().map(a->
new User2(u.getName(), a)));