Java 8 中我們可(kě)以通(tōng)過 `::` 關鍵字來(lái)訪問類的(de)構造方法,對(duì)象方法,靜态方法。
現有一個(gè)類 Something:
class Something {
// constructor methods
Something() {}
Something(String something) {
System.out.println(something);
}
// static methods
static String startsWith(String s) {
return String.valueOf(s.charAt(0));
}
// object methods
String endWith(String s) {
return String.valueOf(s.charAt(s.length()-1));
}
void endWith() {}
}
如何用(yòng) ''::'' 來(lái)訪問類Something中的(de)方法呢(ne)?先定義一個(gè)接口,因爲必須要用(yòng) functional interface 來(lái)接收,否則編譯錯誤(The target type of this expression must be a functional interface):
@FunctionalInterface
interface IConvert<F, T> {
T convert(F form);
}
(@FunctionalInterface 注解要求接口有且隻有一個(gè)抽象方法,JDK中有許多(duō)類用(yòng)到該注解,比如 Runnable,它隻有一個(gè) Run 方法。)
觀察接口 IConvert,傳參爲類型 F,返回類型 T。所以,我們可(kě)以這(zhè)樣訪問類Something的(de)方法:
訪問靜态方法:
// static methods
IConvert<String, String> convert = Something::startsWith;
String converted = convert.convert("123");
訪問對(duì)象方法:
// object methods
Something something = new Something();
IConvert<String, String> converter = something::endWith;
String converted = converter.convert("Java");
訪問構造方法:
// constructor methods
IConvert<String, Something> convert = Something::new;
Something something = convert.convert("constructors");
總結:我們可(kě)以把類Something中的(de)方法static String startsWith(String s){...}、String endWith(String s){...}、Something(String something){...}看作是接口IConvert的(de)實現,因爲它們都符合接口定義的(de)那個(gè)“模版”,有傳參類型F以及返回值類型T。比如構造方法Something(String something),它傳參爲String類型,返回值類型爲Something。注解@FunctionalInterface保證了(le)接口有且僅有一個(gè)抽象方法,所以JDK能準确地匹配到相應方法。
|