Java 当有多个参数时,方法引用如何工作
编译器如何确保下面语句的lambda相等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<
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语法,使其与现有实践和代码更加兼容。感谢您的回答,我也有同样的想法,但只是想确认一下这个实现。