如何使用groupingBy返回List <String,String>

Vic*_*azi 0 java

我有一个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>>直接获得

ped*_*mss 5

您可以获取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()

结论:收集器的简单使用告诉您这是您完成流处理的地方,但是我们可以在更复杂的场景中组合收集器.