Java 8 lambda反向操作到Collectors.groupingBy

时间:2014-12-14 00:27:04

标签: lambda java-8

我有一个实体类

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());

2 个答案:

答案 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)));