如何使用groupingBy返回List <string,string =“”>

时间:2017-08-15 18:46:49

标签: java

我有一个包含GroupUserString getGroup()方法的String getName()个实例列表。 我想返回一个Map<String, List<String>>,其中键是组,值是该组的名称列表。

如果我使用

Map<String, List<GroupUser>> groupUserList = users.stream()
           .collect(Collectors.groupingBy(GroupUser::getGroup));

返回Map<String, List<GroupUser>>

如何直接获得Map<String, List<String>>

1 个答案:

答案 0 :(得分:5)

您可以获得一个Map<String, List<String>>,其中键是组,值是一个名称列表:

    Map<String, List<String>> groupUserList = users.stream()
            .collect(
                    Collectors.groupingBy(GroupUser::getGroup, 
                            Collectors.mapping(GroupUser::getName, 
                                    Collectors.toList())));

修改

阐释:

查看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视为收集器,告知流如何处理按键分隔的元素(在我们的示例中,组是键)。

请注意是另一个收藏家。接下来,我们要将GroupUser转换为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()

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