Java IDENTITY_FINISH 特征背后的原因 java.util.stream.Collector

Java reason behind IDENTITY_FINISH characteristic of java.util.stream.Collector

在实施 java.util.stream.Collector 时,我遇到了 IDENTITY_FINISH 特性。

我是看懂了,但是没看懂其中的道理。为什么不在需要时简单地使用 finisher 函数的身份函数?导致架构决定采用它的用例(要求)是什么?

它似乎没有任何性能意义,如果是这样,也许应该考虑以丢弃的方式优化一般的恒等函数。我认为它不需要额外的约定来进行抽象实现。

应用一次身份函数可以忽略不计,但考虑像 groupingBy(function) 这样的收集器,它是 groupingBy(function, Collectors.toList()).

的简写

现在,如果下游收集器没有身份终结器,groupingBy 收集器的终结器必须 运行 在生成的映射上并将终结器应用于每个组。所以 finisher 已经变成了一个函数,它随着生成的地图的大小而缩放,即使实际函数是一个空操作。但即使是默认的下游收集器 toList() 也有一个身份终结器,这使得在可能的情况下希望跳过此开销。

值得记住的是 groupingBy 收集器本身也不需要完成操作,因此如果下游收集器具有身份完成,groupingBy 可以报告 IDENTITY_FINISH 特性也一样,如果它也用在作文中,这将很重要。