String.concat用作BiFunction

时间:2017-01-18 06:16:55

标签: java java-8 method-reference

在尝试使用方法引用时,遇到了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

有人可以帮我理解这里发生的事情吗?

2 个答案:

答案 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");