為追求代碼的簡潔性,JAVA就有了一些列便利化的書寫,如lambda表達式,方法引用等,不熟悉的情況下,往往和看天書差不多。例如以下代碼:
import java.util.function.*;
public class RefTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Function<String,String> f = String::toUpperCase;
//String::toUpperCase為方法引用,相當於
System.out.println(f.apply("java"));
}
}
其功能就是把小寫字母轉換為大寫字母,並輸出。Function<String,String> f是一個函數式接口,本質是一個接口,包含一個只聲明,未定義的函數apply,實現接受一個T參數,返回R參數,具體定義由實現該接口的類給出。
String::toUpperCase是一個叫做方法引用的簡便書寫方法,相當於如下的lambda表達式(String str) -> {return str.toUpperCase();};
其特點是把形參取消掉了,給出的類型信息足夠編譯器編譯。
以上代碼用lambda表達式實現如下:
import java.util.function.*;
public class RefTest {
public static void main(String[] args) {
// 使用常規的 Lambda 表達式
Function<String, String> f = (String str) -> {
return str.toUpperCase();
};
System.out.println(f.apply("java")); // 輸出 "JAVA"
}
上面的代碼可用如下匿名內部類來實現:
import java.util.function.*;
public class RefTest {
public static void main(String[] args) {
// 使用匿名內部類來實現 Function 接口
Function<String, String> f = new Function<String, String>() {
@Override
public String apply(String str) {
// 在這裏實現具體的邏輯
return str.toUpperCase();
}
};
System.out.println(f.apply("java")); // 輸出 "JAVA"
}
也可用如下的具名內部類實現:
import java.util.function.*;
//---使用具名類實現
//1. 創建一個具名類來實現 Function 接口
class UpperCaseFunction implements Function<String, String> {
@Override
public String apply(String str) {
return str.toUpperCase();
}
}
public class RefTest {
public static void main(String[] args) {
// 2. 實例化這個具名類
Function<String, String> f = new UpperCaseFunction();
System.out.println(f.apply("java")); // 輸出 "JAVA"
}
}
總結:由上面的例子代碼可見方法引用,lambda表達式其本質作用是,使用一個實現某個接口的類的時候,重構該接口的接口函數,使用方法引用,lambda表達式可以簡化書寫。就是一種語法糖。
看懂代碼的前提是查清楚接口的定義。