為追求代碼的簡潔性,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表達式可以簡化書寫。就是一種語法糖。
看懂代碼的前提是查清楚接口的定義。