我有一个GroupUser实例列表String getGroup()和String getName()方法.我想返回Map<String, List<String>>键是组的位置,值是该组的名称列表.
如果我使用
Map<String, List<GroupUser>> groupUserList = users.stream()
.collect(Collectors.groupingBy(GroupUser::getGroup));
Run Code Online (Sandbox Code Playgroud)
返回 Map<String, List<GroupUser>>
我怎样才能Map<String, List<String>>直接获得
您可以获取Map<String, List<String>>密钥是组的位置,值是一个名称列表:
Map<String, List<String>> groupUserList = users.stream()
.collect(
Collectors.groupingBy(GroupUser::getGroup,
Collectors.mapping(GroupUser::getName,
Collectors.toList())));
Run Code Online (Sandbox Code Playgroud)
阐释:
看看groupingBy javadocs,我们看到其中一个重载有签名:
public static <T,K,A,D> Collector<T,?,Map<K,D>> groupingBy(Function<? super T,? extends K> classifier, Collector<? super T,A,D> downstream)
您可以将此downstream视为一个收集器,告诉流如何处理由键分隔的元素(在我们的示例中,组是键).
请注意,它是另一个收集器.接下来我们要将a GroupUser转换为a String的名称.我们知道我们用流转换流的元素map.然而这需要一个Collector.
进一步了解Collectors API,我们看到我们已经有了一个收集器,它可以映射元素并获取另一个元素Collector
public static <T,U,A,R> Collector<T,?,R> mapping(Function<? super T,? extends U> mapper, Collector<? super U,A,R> downstream)
现在来自文档:downstream - a collector which will accept mapped values.由于我们映射GroupedUser到它的名称,剩下要做的最后一件事就是在列表中收集它们,这是最常用的收集器之一.Collectors.toList()
结论:收集器的简单使用告诉您这是您完成流处理的地方,但是我们可以在更复杂的场景中组合收集器.