当有多个参数时,方法引用如何工作

How does method references work under hood when there are multiple arguments

编译器如何确保以下语句的等效 lambda

BinaryOperator<String> concatOperator = String::concat; 

BinaryOperator<String> concatOperator = (resultString, inputString) -> resultString.concat(inputString);

而不是

BinaryOperator<String> concatOperator = (resultString, inputString) -> inputString.concat(resultString);

使用方法引用的代码行在 types of method reference 下分类为 -

引用特定类型的任意对象的实例方法

其中第一个 lambda 参数被推断为类型 String 的对象,在该对象上调用名为 concat 的方法,参数值等于第二个 lambda 参数。在上述情况下为:

BinaryOperator<String> concatOperator = (result, input) -> result.concat(input);

此行为在 JLS 中有详细记录

15.13.3. Run-Time Evaluation of Method References

If the compile-time declaration is an instance method, then the target reference is the first formal parameter of the invocation method. Otherwise, there is no target reference.

If the compile-time declaration is an instance method, then the arguments to the method invocation expression (if any) are the second and subsequent formal parameters of the invocation method. Otherwise, the arguments to the method invocation expression are the formal parameters of the invocation method.

这似乎是合理且直观的。如果你采用一个带有 arity n (n > 2) 的方法,很明显目标引用应该是第一个参数,而不是最后一个,也不是中间那个。