11

我之前问过一个关于增强一些代码的问题,在这里@Holger给了我正确的回应,他说:

每当您发现自己使用带有 groupingBy 的缩减收集器时,您应该检查 toMap 是否更合适

这似乎是一种模式!他建议我做的非常完美。

这是一个众所周知的模式吗?为什么toMap比(在某些情况下)结合groupingByand更好reducing

4

1 回答 1

16

通过使用这两种收集器的经验,这种模式变得很明显。您会在 Stackoverflow 上找到几个问答,其中任何一个收集器都可以解决问题,但其中一个似乎更适合特定任务。

这是ReductionMutable Reduction之间差异的变体。在第一种情况下,我们reduce在 Stream 上使用,在第二种情况下,我们使用collect. 很自然,当我们想要对组应用可变归约时,groupingBy以秒为参数的收集器是正确的工具。Collector

不是很明显,当我们想要执行经典归约时,采用合并toMap函数的收集器是正确的工具,因为合并函数具有与归约函数相同的形状和目的,即使它不是这样调用的。

在实践中,我们注意到执行归约的收集器返回一个Optional,这在与 一起使用时通常是不希望的,这就是在这些情况下工作更顺利groupingBy的原因。toMap

在使用这些 API 时肯定会有更多的模式变得明显,但是将它们收集在一个答案中并不是 Stackoverflow 的范围。

于 2019-07-15T15:11:44.053 回答