例如,如果我打算对某些元素进行分区,则可以执行以下操作:

Stream.of("I", "Love", "Stack Overflow")
      .collect(Collectors.partitioningBy(s -> s.length() > 3))
      .forEach((k, v) -> System.out.println(k + " => " + v));

输出:
false => [I]
true => [Love, Stack Overflow]

但是对我来说partioningBy只是groupingBy的一个子案例。尽管前者接受Predicate作为参数,而后者接受Function,但我只是将分区视为常规分组功能。

因此,相同的代码执行的操作完全相同:
 Stream.of("I", "Love", "Stack Overflow")
       .collect(Collectors.groupingBy(s -> s.length() > 3))
       .forEach((k, v) -> System.out.println(k + " => " + v));

这也导致Map<Boolean, List<String>>

那么,有什么理由我应该使用partioningBy而不是groupingBy吗?谢谢

最佳答案

partitioningBy 始终会返回一个包含两个条目的映射,一个用于谓词为true的映射,另一个用于为false的映射。
两个条目都有可能有空列表,但它们将存在。
这是 groupingBy 不会做的,因为它仅在需要时创建条目。
在极端情况下,如果将空流发送到 partitioningBy ,您仍然会在 map 中获得两个条目,而 groupingBy 将返回一个空 map 。
编辑:如下所述,Java文档中未提及此行为,但是更改它会带走 partitioningBy 当前提供的附加值。对于Java 9,这已经在规范中。

07-24 09:34