String.concat用作BiFunction

6
当尝试使用方法引用时,我遇到了这样一种情况: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

有人能帮我理解这里发生了什么吗?


1
它取了 str1str2,并在它们上调用了 String#concat(String, String) 吗?你自己说了,你还错过了什么吗? - Rogue
1
还要注意字符串是不可变的,调用concat方法会产生一个不同的字符串对象,它不会改变原来的字符串(如果这是你想问的)。 - Rogue
不是要问变异的事情。但我好像无法在String类中使用String#concat(String, String)方法。你有链接吗? - Himanshu Bhardwaj
2
啊,我的错,这是一个隐式操作。String::concat 操作两个字符串操作数,利用第一个作为实例。您将在流中看到类似的操作(例如,许多 #map 调用)。 - Rogue
2
大家可以参考一下这个链接:https://dev59.com/tIHba4cB1Zd3GeqPT6Ii - Himanshu Bhardwaj
1
可能是API“String :: concat”中的奇怪语法的重复问题。 - Didier L
2个回答

4
String.concat()方法需要两个参数。第一个参数是隐式的,即调用该方法的字符串本身,第二个参数是显式的参数。

在IT技术中,String.concat()方法通常用于将两个字符串连接起来形成一个新的字符串。

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] Identifier,则调用方法的主体类似于编译时声明的方法引用表达式的方法调用表达式的效果。方法调用表达式的运行时评估如§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");

+1。不确定为什么被踩了。但部分是正确的。@Thomas,你能否扩展一下你的答案,以便与方法引用和BiFunction相关联。 - Himanshu Bhardwaj

3
方法引用 String::concat 表示一个目标类型的实例方法引用,它的函数接受两个 String 参数并返回一个 String。第一个参数将成为 concat() 方法的接收者,第二个参数将传递给 concat() 方法。
请参考未绑定接收器的详细信息,请查阅Java8开发入门书籍,其中有详细的例子解释。

谢谢,那个页面澄清了问题。 - Himanshu Bhardwaj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接