Java 为什么StringBuilder::append是双消费者<;StringBuilder,字符串>;?

Java 为什么StringBuilder::append是双消费者<;StringBuilder,字符串>;?,java,java-8,Java,Java 8,我发现了一个使用流API的有趣示例: Stream=Stream.of(“w”、“o”、“l”、“f”); BiConsumer append=StringBuilder::append; StringBuilder collected=stream.collect(StringBuilder::new,append,StringBuilder::append); 系统输出打印项次(已收集)//它工作正常 Stream.collect采用三个参数: 供应商-供应商、双消费蓄能器、双消费组合器

我发现了一个使用流API的有趣示例:

Stream=Stream.of(“w”、“o”、“l”、“f”);
BiConsumer append=StringBuilder::append;
StringBuilder collected=stream.collect(StringBuilder::new,append,StringBuilder::append);
系统输出打印项次(已收集)//它工作正常
Stream.collect采用三个参数:

供应商-供应商、双消费蓄能器、双消费组合器
BiConsumer接受两个参数,不返回任何内容。 为什么这行代码可以编译并工作

BiConsumer append=StringBuilder::append;
StringBuilder没有void method append(java.lang.StringBuilder,java.lang.String)。

或多或少地指定接收方(调用该方法的对象)可以成为函数接口的第一个参数:

如果表单是ReferenceType::[TypeArguments]Identifier,则调用方法的主体对于编译时声明(即方法引用表达式的编译时声明)具有类似的方法调用表达式的效果。方法调用表达式的运行时评估如§15.12.4.3、§15.12.4.4和§15.12.4.5所述,其中:

调用模式源自§15.12.3中规定的编译时声明

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

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

编译时声明实际上是一个实例方法,因此
StringBuilder
成为调用方法的第一个参数,
String
成为第二个参数

换句话说,方法引用
SomeClass::instanceMethod
相当于lambda
(SomeClass receiver,args…)->receiver。instanceMethod(args…)

或多或少地指定了receiver——调用方法的对象——可以成为函数接口的第一个参数:

如果表单是ReferenceType::[TypeArguments]Identifier,则调用方法的主体对于编译时声明(即方法引用表达式的编译时声明)具有类似的方法调用表达式的效果。方法调用表达式的运行时评估如§15.12.4.3、§15.12.4.4和§15.12.4.5所述,其中:

调用模式源自§15.12.3中规定的编译时声明

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

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

编译时声明实际上是一个实例方法,因此
StringBuilder
成为调用方法的第一个参数,
String
成为第二个参数


换句话说,方法引用
SomeClass::instanceMethod
相当于lambda
(SomeClass receiver,args…)->receiver。instanceMethod(args…)

BiConsumer的第一个类型参数是应用该方法的类型,第二个是该方法的单个参数。经典的例子是
ArrayList::add

BiConsumer
的第一个类型参数是应用该方法的类型,第二个是该方法的单个参数。经典的例子是
ArrayList::add

,第一个参数成为调用方法的对象。而且
StringBuilder.append(String)
确实存在。有一件事可以帮助我了解它,那就是成员函数实际上与带有此
的额外参数的静态函数没有什么不同。每当您看到
ClassName::memberFunction
时,第一个参数总是
ClassName this
我在前面提到的副本中看不到答案。有人想详细说明一下吗?我也有同样的问题。由于append不是void方法,而BiConsumer的非抽象方法具有void方法,因此上述代码是如何编译的?第一个参数成为调用该方法的对象。而且
StringBuilder.append(String)
确实存在。有一件事可以帮助我了解它,那就是成员函数实际上与带有此
的额外参数的静态函数没有什么不同。每当您看到
ClassName::memberFunction
时,第一个参数总是
ClassName this
我在前面提到的副本中看不到答案。有人想详细说明一下吗?我也有同样的问题。既然append不是一个void方法,而BiConsumer的非抽象方法有一个void方法,那么上面的代码是如何编译的?