【问题标题】:Java Streams: Replacing groupingBy and reducing by toMapJava Streams:替换 groupingBy 和 reduce by toMap
【发布时间】:2019-11-24 06:47:57
【问题描述】:

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

每当你发现自己使用减少收集器时 groupingBy,你应该检查toMap是否更合适

它看起来像一个模式!而且他建议我做的事情非常完美。

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

【问题讨论】:

  • 我认为这只是常识和Collectors 知识,如果你问我,没有什么比模式更重要。
  • “谁能告诉我他是怎么想出来的?”我猜 Holger 会是最好的人选!
  • @ElmaCherb 再次评论该答案(使用@Holger)会直接通知他。那是几周前的事了,所以除非得到提示,否则他不太可能重新讨论这个问题。

标签: java java-stream grouping collectors reducing


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 谢谢。我一次又一次地阅读了这篇文章。在博客中详细说明这些“更多模式”或分享一些现有文章的链接怎么样?
  • @Naman 也许我应该开始写博客了……
猜你喜欢
  • 2018-05-31
  • 1970-01-01
  • 2015-01-05
  • 2013-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-17
相关资源
最近更新 更多