分区的目的是什么

2022-08-31 20:12:43

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

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]

但对我来说只是 的一个子案例。虽然前者接受 as 参数,而后者接受 as 参数,但我只是将分区视为正常的分组函数。partioningBygroupingByPredicateFunction

所以同样的代码做完全相同的事情:

 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>>

那么有什么理由我应该使用而不是?谢谢partioningBygroupingBy


答案 1

partitioningBy 将始终返回一个包含两个条目的映射,一个用于谓词为 true 的位置,另一个用于谓词为 false 的位置。两个条目都有可能具有空列表,但它们将存在。

这是分组By不会做的事情,因为它只在需要时创建条目。

在极端情况下,如果将空流发送到分区 By,则仍将在映射中获得两个条目,而 groupingBy 将返回空映射。

编辑:如下所述,Java文档中没有提到此行为,但是更改它将带走当前提供的附加值分区。对于Java 9,这已经在规范中。


答案 2

partitioningBy效率略高,使用针对密钥只是 .Mapboolean

(这也可能有助于澄清你的意思; 有助于有效地了解存在用于对数据进行分区的布尔条件。partitioningBy


推荐