Java Streams:替换 groupingBy 并减少 toMap
Java Streams: Replacing groupingBy and reducing by toMap
我之前问过一个关于增强某些代码的问题,. @Holger 给了我正确的回答,他说:
Whenever you find yourself using the reducing collector with
groupingBy, you should check whether toMap isn’t more appropriate
好像是一种模式!他建议我做的非常完美。
这是一个众所周知的模式吗?为什么 toMap
比(在某些情况下)组合 groupingBy
和 reducing
更好?
通过使用这两种收集器的经验,这种模式变得很明显。您会在 Whosebug 上找到几个问答,其中一个问题可以用任一收集器解决,但其中一个似乎更适合特定任务。
这是Reduction and Mutable Reduction之间差异的变体。在第一种情况下,我们在 Stream 上使用 reduce
,在第二种情况下我们使用 collect
。很自然地,groupingBy
收集器以第二个 Collector
作为参数,当我们想要对组应用可变归约时,它是正确的工具。
不是很明显,当我们想要执行经典归约时,采用 merge 函数的 toMap
收集器是正确的工具,因为该合并函数具有相同的作为 Reduction 函数的形状和用途,即使它不是这样调用的。
在实践中,我们注意到执行归约的收集器,return 和 Optional
,在与 groupingBy
一起使用时通常不需要,这就是为什么toMap
在这些情况下工作更顺畅。
肯定有更多模式在使用这些 API 时变得明显,但将它们集中在一个答案中不是 Whosebug 的范围。
我之前问过一个关于增强某些代码的问题,
Whenever you find yourself using the reducing collector with groupingBy, you should check whether toMap isn’t more appropriate
好像是一种模式!他建议我做的非常完美。
这是一个众所周知的模式吗?为什么 toMap
比(在某些情况下)组合 groupingBy
和 reducing
更好?
通过使用这两种收集器的经验,这种模式变得很明显。您会在 Whosebug 上找到几个问答,其中一个问题可以用任一收集器解决,但其中一个似乎更适合特定任务。
这是Reduction and Mutable Reduction之间差异的变体。在第一种情况下,我们在 Stream 上使用 reduce
,在第二种情况下我们使用 collect
。很自然地,groupingBy
收集器以第二个 Collector
作为参数,当我们想要对组应用可变归约时,它是正确的工具。
不是很明显,当我们想要执行经典归约时,采用 merge 函数的 toMap
收集器是正确的工具,因为该合并函数具有相同的作为 Reduction 函数的形状和用途,即使它不是这样调用的。
在实践中,我们注意到执行归约的收集器,return 和 Optional
,在与 groupingBy
一起使用时通常不需要,这就是为什么toMap
在这些情况下工作更顺畅。
肯定有更多模式在使用这些 API 时变得明显,但将它们集中在一个答案中不是 Whosebug 的范围。