例1:無參函數的簡寫
如果需要新建一個線程,一種常見的寫法是這樣:
// JDK7 匿名內部類寫法 new Thread(new Runnable(){// 接口名 @Override public void run(){// 方法名 System.out.println("Thread run()"); } }).start();
上述代碼給Tread類傳遞了一個匿名的Runnable對象,重載Runnable接口的run()方法來實現相應邏輯。這是JDK7以及之前的常見寫法。匿名內部類省去了為類起名字的煩惱,但還是不夠簡化,在Java 8中可以簡化為如下形式:
// JDK8 Lambda表達式寫法 new Thread( () -> System.out.println("Thread run()")// 省略接口名和方法名 ).start();
上述代碼跟匿名內部類的作用是一樣的,但比匿名內部類更進一步。這里連接口名和函數名都一同省掉了,寫起來更加神清氣爽。如果函數體有多行,可以用大括號括起來,就像這樣:
// JDK8 Lambda表達式代碼塊寫法 new Thread( () -> { System.out.print("Hello"); System.out.println(" Hoolee"); } ).start();
例2:帶參函數的簡寫
如果要給一個字符串列表通過自定義比較器,按照字符串長度進行排序,Java 7的書寫形式如下:
// JDK7 匿名內部類寫法 List<String> list = Arrays.asList("I", "love", "you", "too"); Collections.sort(list, new Comparator<String>(){// 接口名 @Override public int compare(String s1, String s2){// 方法名 if(s1 == null) return -1; if(s2 == null) return 1; return s1.length()-s2.length(); } });
上述代碼通過內部類重載了Comparator接口的compare()方法,實現比較邏輯。采用Lambda表達式可簡寫如下:
// JDK8 Lambda表達式寫法 List<String> list = Arrays.asList("I", "love", "you", "too"); Collections.sort(list, (s1, s2) ->{// 省略參數表的類型 if(s1 == null) return -1; if(s2 == null) return 1; return s1.length()-s2.length(); });
上述代碼跟匿名內部類的作用是一樣的。除了省略了接口名和方法名,代碼中把參數表的類型也省略了。這得益於javac的類型推斷機制,編譯器能夠根據上下文信息推斷出參數的類型,當然也有推斷失敗的時候,這時就需要手動指明參數類型了。注意,Java是強類型語言,每個變量和對象都必需有明確的類型。