我正在查看1.8版本对Java SE API所做的一些更改,当我查看新方法Map.merge时,它显示了如何将它与线API“String :: concat”中的奇数语法
map.merge(key, msg, String::concat)
我知道如何使用lambda表达式创建的匿名功能接口,但这似乎使用方法作为双功能。我喜欢理解和使用隐含的Java语法,但是我无法在任何地方找到任何关于此语法的提及。
我正在查看1.8版本对Java SE API所做的一些更改,当我查看新方法Map.merge时,它显示了如何将它与线API“String :: concat”中的奇数语法
map.merge(key, msg, String::concat)
我知道如何使用lambda表达式创建的匿名功能接口,但这似乎使用方法作为双功能。我喜欢理解和使用隐含的Java语法,但是我无法在任何地方找到任何关于此语法的提及。
String::concat
是对String类的concat()
方法的引用。
甲BiFunction
是具有单个方法apply
接受两个参数(第一T
类型和U
类型的第二)功能性的接口,并返回型的结果R
(换言之,接口BiFunction<T,U,R>
具有方法R apply(T t, U u)
)。
map.merge
预计BiFunction<? super V,? super V,? extends V>
作为第三个参数,其中V
是Map
的值。如果您的Map
值为String
,则可以使用接受两个String
参数并返回String
的任何方法。
String::concat
满足这些要求,这就是为什么它可以用于map.merge
。
它满足这些要求的原因,需要一个解释:
的String::concat
签名是public String concat(String str)
。
这可以看作是一个函数,它具有String类型的两个参数(this
,调用此方法的实例和str
参数)以及String类型的结果。
方法参考在这里描述:http://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html – msandiford
谢谢。我有点猜到了。我想知道使用方法作为功能接口的规则是什么? – yesennes
@msandiford谢谢!这正是我所寻找的。 – yesennes