Java 什么';MethodHandles.foldArguments和MethodHandle.asCollector之间的关系是什么?

Java 什么';MethodHandles.foldArguments和MethodHandle.asCollector之间的关系是什么?,java,methodhandle,Java,Methodhandle,本文件包含以下附加说明: (注意,DROPARGORGEs可用于移除组合器或目标不希望接收的任何参数。如果一些传入的参数仅用于组合器,则考虑使用AsC采藏器来代替,因为这些参数不需要在目标条目上的堆栈上生存)。 首先,我不清楚这是否意味着用dropArguments+asCollector替换foldArguments,用asCollector替换foldArguments+dropArguments,用foldArguments+asCollector替换foldArguments+dropA

本文件包含以下附加说明:

(注意,DROPARGORGEs可用于移除组合器或目标不希望接收的任何参数。如果一些传入的参数仅用于组合器,则考虑使用AsC采藏器来代替,因为这些参数不需要在目标条目上的堆栈上生存)。 首先,我不清楚这是否意味着用dropArguments+asCollector替换foldArguments,用asCollector替换foldArguments+dropArguments,用foldArguments+asCollector替换foldArguments+dropArguments,等等

其次,我不明白为什么MethodHandles.asCollector在这里是相关的

  • 注释中并没有说“如果您只想将参数收集到数组中,请使用asCollector”,这似乎暗示asCollector是foldArguments(可能与dropArguments结合使用)的一般替代品,而事实并非如此

  • 关于“进入目标时在堆栈上活动”的部分似乎暗示我应该首先将“仅针对合并器”的任何参数收集到一个带有asCollector的数组中,然后再将它们发送到合并器。我不明白添加数组创建和额外级别的间接寻址如何有帮助,特别是因为如果生成的方法句柄内联,JVM无论如何都会尝试优化数组创建。如果使用dropArguments删除仅组合器参数,JVM应该能够证明它们没有在目标中使用。如果由于某种原因JVM无法证明目标中没有使用仅合并器参数,因此必须使它们保持活动状态,那么asCollector创建的数组肯定会保持活动状态,从而使其内容也保持活动状态。它们将在堆上而不是堆栈上,但我看不出这有什么帮助(特别是当它们是对堆上已有对象的引用时)

  • Java8添加了foldArguments和dropArguments,以明显的方式实现了仅限收集器的参数。Javadoc collectArguments没有提到将asCollector作为替代品,建议使用asCollector的任何建议都不再适用,但foldArguments Javadoc仍然包含令人困惑的附加说明


MethodHandles.foldArguments和MethodHandle.asCollector之间的关系(如果有)是什么?

我知道这个问题很老,但我仍然希望得到答案。(反Roomba评论2)Java 9将引入一个重载,它的文档中没有那种虚假的注释。但是对于没有位置参数的旧方法,注释仍然存在,我建议打开一个关于方法文档的RFE。