有多个参数时,方法引用如何在后台工作

Tus*_*kar 1 java java-8 method-reference

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

BinaryOperator<String> concatOperator = String::concat; 
Run Code Online (Sandbox Code Playgroud)

BinaryOperator<String> concatOperator = (resultString, inputString) -> resultString.concat(inputString);
Run Code Online (Sandbox Code Playgroud)

并不是

BinaryOperator<String> concatOperator = (resultString, inputString) -> inputString.concat(resultString);
Run Code Online (Sandbox Code Playgroud)

And*_*lko 5

JLS中充分记录了此行为

15.13.3。方法引用的运行时评估

如果编译时声明是实例方法,则目标引用是调用方法的第一个形式参数。否则,没有目标参考。

如果编译时声明是实例方法,则方法调用表达式的参数(如果有)是调用方法的第二个和后续形式参数。否则,方法调用表达式的参数是调用方法的形式参数。

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