当前位置: 首页 > 面试题库 >

Java Streams:替换分组并按toMap减少

陈斌蔚
2023-03-14
问题内容

我大约提高了一些代码,以前也问了一个问题在这里。@霍尔格给了我正确的回答,他说:

每当发现自己通过groupingBy使用reducer收集器时,都应检查toMap是否更合适

好像是花样!他建议我做的只是完美的。

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


问题答案:

通过使用两个收集器的经验,这种模式变得显而易见。您会在Stackoverflow上找到一些问题和解答,无论使用哪种收集器都可以解决问题,但是其中一个似乎更适合特定任务。

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

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

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

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



 类似资料:
  • 问题内容: 我有一个用例,我必须 如果键在ConcurrentHashMap中不存在,则插入一个新值 如果键已经存在于ConcurrentHashMap中,则新值将旧值替换为新值(其中新值是从旧值派生的(不是昂贵的操作)) 我提供以下代码: 您认为它是正确的并且是线程安全的吗? 有没有更简单的方法? 问题答案: 您可以使用下面与您的代码等效的代码来使其短一些。我已经对数以千计的线程进行并发访问进行

  • 问题内容: 建立库存系统。我有很多产品,每个产品都有三个不同的变量。因此,对于总库存,我想按两列(产品和尺寸)和总数量分组以获得总库存。 我想要输出的内容: 小部件一-2:375 小部件二-3:150 小部件二-2:150 我想出了如何使用以下代码将一列分组并求和: 我只是按两列分组。可能吗?还是应该仅针对这三种尺寸的商品创建三种不同的产品并删除该列?谢谢。 问题答案: 根据示例表,您似乎希望分组

  • 问题内容: 我有类似的文件: 我的文档可能很大(但这些字段不是很大),并且从头开始生成它们很昂贵。 有时我需要更新这些批次-因此进行 部分 更新(节省“索引客户端”的处理能力和带宽,从而节省时间)并用新值替换MyProp值将是有益的。 原始文件示例: 更新文档的示例(或更确切地说,外观): 从我所看到的,这包括脚本。 谁能用剩下的难题启发我? 赏金添加: 如果可能的话,我还想在批处理语句中提供一些

  • 我有一个表abc,其中可以针对一个UserId有一个或多个行。abc表有列值。我希望结果是每个UserId值的总和。 示例:userid1- 我现在拥有的: 结果:它单独返回每行的总和。所以我有这样的: 用户标识1- 我应该更改或添加什么来完成查询? PS.我知道这是一个非常常见/简单的解决方案,但似乎找不到任何解决方案。:(

  • 问题内容: 我有以下几点: http://sqlfiddle.com/#!6/226ae/1 我现在尝试为一年中的每个星期添加一行,并相应地过滤联系人。CONTACTS有一个datetime列。新表将如下所示: 我认为需要使用DATEADD,但是在如何开始更改查询方面我迷茫了。 我确实知道MySQL具有GROUP BY WEEK命令,但我认为SQL没有等效的命令。做到这一点的最佳方法是什么? 问题

  • 有没有一种方法可以在android studio或使用命令行脚本中找到并替换一个单词在整个项目中出现的所有情况(而不仅仅是使用refactor->rename的单个类),同时还可以维护大小写? 例如,供应商必须到商户,供应商->商户,供应商->商户。我的老板希望我更改供应商与商人的项目我正在工作的所有实例。我做了大约一个小时,我知道我在浪费时间。让我知道任何时候保存的建议。