在尝试使用方法引用时,遇到了concat方法可以用作BiFunction的情况,据我所知,BiFunction apply方法需要2个输入参数并生成结果。然而,concat方法接受1个输入参数并返回带有此值的连接字符串。
示例代码:
public class Test {
public static void main(String[] args) {
Test t = new Test();
String str1 = "Hello";
String str2 = "Workld";
System.out.println(t.stringManipulator(str1, str2, String::concat));
System.out.println(str1);
System.out.println(str2);
}
private String stringManipulator(String inputStr, String inputStr2, BiFunction<String, String, String> function) {
return function.apply(inputStr, inputStr2);
}
}
输出
HelloWorkld
Hello
Workld
有人可以帮我理解这里发生的事情吗?
答案 0 :(得分:3)
方法引用
String::concat
表示实例方法 对于其函数需要两个String
争论的目标类型的引用 并返回String
。第一个争论将是接收者concat()
方法和第二个争论将被传递给concat()
方法。
有关未绑定接收器的详细信息,请参阅Beginning Java8 book。它有一个确切的例子说明。
答案 1 :(得分:1)
String.concat()
方法有两个参数。第一个是(implicit)参数是调用该方法的String,第二个是显式参数。
在
str1.concat(str2)
str1
是隐式参数(在concat
方法中可以作为this
访问),str2
是显式参数。
或者,如Java语言规范(https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.13.3)
中所述如果表单是ReferenceType :: [TypeArguments]标识符,则调用方法的主体类似地具有编译时声明的方法调用表达式的效果,该声明是方法引用表达式的编译时声明。方法调用表达式的运行时评估在§15.12.4.3,§15.12.4.4和§15.12.4.5中规定,其中:
调用模式源自§15.12.3中指定的编译时声明。
如果编译时声明是实例方法,则目标引用是调用方法的第一个形式参数。否则,没有目标参考。
如果编译时声明是实例方法,则方法调用表达式的参数(如果有)是调用方法的第二个和后续形式参数。否则,方法调用表达式的参数是调用方法的形式参数。
那意味着,
BiFunction<String, String, String> function = String::concat;
function.apply("abc", "def");
将以
执行 "abc".concat("def");