Java Streams:通过不在列表中的值对列表进行分组,将返回一个映射,其中包含不存在的值作为键,原始列表作为值?

Java Streams:通过不在列表中的值对列表进行分组,将返回一个映射,其中包含不存在的值作为键,原始列表作为值?,java,java-stream,Java,Java Stream,这可能是一个愚蠢的问题,但我正试图理解为什么会出现以下代码: public static void main(String[] args) { List<String> testData = Lists.newArrayList("a", "b", "c"); Map<String, List<String>> grouped = testData.stream().collect(Collectors.groupingBy(item ->

这可能是一个愚蠢的问题,但我正试图理解为什么会出现以下代码:

public static void main(String[] args) {
    List<String> testData = Lists.newArrayList("a", "b", "c");
    Map<String, List<String>> grouped = testData.stream().collect(Collectors.groupingBy(item -> "z"));
    System.out.println(grouped);
}
我在这里试图通过列表中不存在的值来分割列表。因此,我预计会有以下结果:

{z=[]}
在我的例子中,分类器函数并没有那么简单,但简而言之,它可能会生成一个不在列表值中的分类器值


我这里缺少什么?

收集器。groupingBy
将根据函数返回的键在
映射中对所有项目进行分组

您正在为所有项目返回相同的键“z”,因此它们都被分组在一起。

收集器。groupingBy
将根据函数返回的键对
映射中的所有项目进行分组

您为所有项目返回相同的键“z”,因此它们都被分组在一起。

另一个答案解释了分组方式的工作原理。我不确定是否完全理解你的要求。但是您可能想看看
partitioningBy
是否能帮助您

List<String> testData = Arrays.asList("a", "b", "c", "z");
Map<Boolean, List<String>> grouped = testData.stream()
                                                    .collect(Collectors.partitioningBy(item -> item.equals("z")));
System.out.println(grouped);

另一个答案解释了GROUPBY是如何工作的。我不确定是否完全理解你的要求。但是您可能想看看
partitioningBy
是否能帮助您

List<String> testData = Arrays.asList("a", "b", "c", "z");
Map<Boolean, List<String>> grouped = testData.stream()
                                                    .collect(Collectors.partitioningBy(item -> item.equals("z")));
System.out.println(grouped);

groupingBy
不是过滤功能。每个流元素总是以创建的组中的一个结束,您的分组功能只是告诉您在哪一个组中。假设您有一个列表
a、b、c、d
,并且您按
c
进行分段,地图会是什么样子<代码>{c=[c,d]}
groupingBy
不是筛选函数。每个流元素总是以创建的组中的一个结束,您的分组功能只是告诉您在哪一个组中。假设您有一个列表
a、b、c、d
,并且您按
c
进行分段,地图会是什么样子<代码>{c=[c,d]}
?我有同样的想法,但我认为这是不对的。例如,如果你按
b
分段,结果会是什么?我有同样的想法,但我不认为这是正确的。例如,如果您按
b
分段,输出结果会是什么?
{false=[a, b, c], true=[z]}