使用groupBy将列表转换为映射

时间:2016-10-07 16:29:03

标签: java java-8

假设我有一个如下所示的对象列表:

Foo
int id
Owner owner
int targetId

我想将此列表转换为Map<Owner, Set<Integer>> ownerToTargetIds的映射,该映射将为Foo对象列表中的每个唯一所有者提供一个键,并为每个foo对象中找到的所有targetIds赋值那个主人。例如:

Foo a {1, 2, 3}
Foo b {2, 2, 4}
Foo c {3, 2, 5}

在上面你可以将这个列表转换为一个地图,其中key = 2,values = Set {3,4,5}。

我尝试使用流中的分组功能来达到我可以从所有者到整个记录的映射,但这不起作用:

Map<Owner, List<Foo>> userToTargetIds = foo.get().stream()
                    .collect(toMap(Foo::getTargetId));

1 个答案:

答案 0 :(得分:1)

正如JB Nizet所说:RTM

但是在这里剪了一下:

Map<Owner, Set<Integer>> userToTargetIds
         = fooList.stream().collect(groupingBy(Foo::getOwner,
                                              mapping(Foo::getTargetId, toSet())));