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

Java 当有多个参数时,方法引用如何工作,java,java-8,method-reference,Java,Java 8,Method Reference,编译器如何确保下面语句的lambda相等 BinaryOperator<String> concatOperator = String::concat; BinaryOperator-concatOperator=String::concat; 是 BinaryOperator concatoOperator=(resultString,inputString)->resultString.concat(inputString); 而不是 BinaryOperator<

编译器如何确保下面语句的lambda相等

BinaryOperator<String> concatOperator = String::concat; 
BinaryOperator-concatOperator=String::concat;

BinaryOperator concatoOperator=(resultString,inputString)->resultString.concat(inputString);
而不是

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

使用方法引用的代码行被分类为-

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

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

BinaryOperator<String> concatOperator = (result, input) -> result.concat(input);
BinaryOperator concatoOperator=(结果,输入)->result.concat(输入);

使用方法引用的代码行被分类为-

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

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

BinaryOperator<String> concatOperator = (result, input) -> result.concat(input);
BinaryOperator concatoOperator=(结果,输入)->result.concat(输入);

JLS中详细记录了这种行为

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

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


这似乎是合理和直观的。如果采用了一种方法,即“代码< n>代码>(<代码> n>2 < /代码>),很明显,目标引用应该是第一个参数,而不是最后一个,而不是中间的一个。

在JLS

中这种行为是有充分记载的。 如果编译时声明是实例方法,则目标引用是调用方法的第一个形式参数。否则,就没有目标引用

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


这似乎是合理和直观的。如果你使用一个方法,如代码< N>代码>(代码> n>2 < /代码>),很明显,目标引用应该是第一个参数,而不是最后一个,而不是中间的一个。

假设,在一个实现之间必须有一个选择。作者选择前者而不是后者作为方法引用。考虑到语言适应LtoR语法,使其与现有实践和代码更加兼容。感谢您的回答,我有同样的信念,但只是想确认一下这个实现。假设,必须在一个实现和另一个实现之间进行选择。作者选择前者而不是后者作为方法引用。考虑到语言适应LtoR语法,使其与现有实践和代码更加兼容。感谢您的回答,我也有同样的想法,但只是想确认一下这个实现。