2014-07-18 24 views
6

我正在查看1.8版本对Java SE API所做的一些更改,当我查看新方法Map.merge时,它显示了如何将它与线API“String :: concat”中的奇数语法

map.merge(key, msg, String::concat) 

我知道如何使用lambda表达式创建的匿名功能接口,但这似乎使用方法作为双功能。我喜欢理解和使用隐含的Java语法,但是我无法在任何地方找到任何关于此语法的提及。

回答

5

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>作为第三个参数,其中VMap的值。如果您的Map值为String,则可以使用接受两个String参数并返回String的任何方法。

String::concat满足这些要求,这就是为什么它可以用于map.merge

它满足这些要求的原因,需要一个解释:

String::concat签名是public String concat(String str)

这可以看作是一个函数,它具有String类型的两个参数(this,调用此方法的实例和str参数)以及String类型的结果。

+2

方法参考在这里描述:http://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html – msandiford

+0

谢谢。我有点猜到了。我想知道使用方法作为功能接口的规则是什么? – yesennes

+0

@msandiford谢谢!这正是我所寻找的。 – yesennes