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
特性也一样,如果它也用在作文中,这将很重要。
在实施 java.util.stream.Collector 时,我遇到了 IDENTITY_FINISH 特性。
我是看懂了,但是没看懂其中的道理。为什么不在需要时简单地使用 finisher 函数的身份函数?导致架构决定采用它的用例(要求)是什么?
它似乎没有任何性能意义,如果是这样,也许应该考虑以丢弃的方式优化一般的恒等函数。我认为它不需要额外的约定来进行抽象实现。
应用一次身份函数可以忽略不计,但考虑像 groupingBy(function)
这样的收集器,它是 groupingBy(function, Collectors.toList())
.
现在,如果下游收集器没有身份终结器,groupingBy
收集器的终结器必须 运行 在生成的映射上并将终结器应用于每个组。所以 finisher 已经变成了一个函数,它随着生成的地图的大小而缩放,即使实际函数是一个空操作。但即使是默认的下游收集器 toList()
也有一个身份终结器,这使得在可能的情况下希望跳过此开销。
值得记住的是 groupingBy
收集器本身也不需要完成操作,因此如果下游收集器具有身份完成,groupingBy
可以报告 IDENTITY_FINISH
特性也一样,如果它也用在作文中,这将很重要。