【问题标题】:Java reason behind IDENTITY_FINISH characteristic of java.util.stream.Collectorjava.util.stream.Collector 的 IDENTITY_FINISH 特性背后的 Java 原因
【发布时间】:2021-10-21 10:03:53
【问题描述】:

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

我确实理解它,但我不明白它背后的原因。为什么不在需要的时候简单地为 finisher 函数使用 identity 函数呢?导致架构决策的用例(要求)是什么?

它似乎没有任何性能意义,如果是这样,那么通常应该考虑以丢弃方式优化恒等函数​​。我认为这是在抽象实现中不需要额外的约定。

【问题讨论】:

  • 我能想到的原因之一是“由于我们无法比较 Function 对象,因此无法检查完成者是否是身份。”。我们不能强迫每个人都使用Function.identity()

标签: java java-stream collectors


【解决方案1】:

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

现在,如果下游收集器没有身份终结器,groupingBy 收集器的终结器必须遍历结果映射并将终结器应用于每个组。因此,finisher 已成为一个随结果地图大小缩放的函数,即使实际函数是空操作。但即使是默认的下游收集器 toList() 也有一个身份终结器,因此希望尽可能跳过此开销。

值得记住的是,groupingBy 收集器本身也不需要完成操作,因此如果下游收集器具有标识完成,groupingBy 也可以报告 IDENTITY_FINISH 特征,这很重要如果它也用于合成中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 2014-10-17
    • 2011-01-31
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多