一、匿名內部類
一個匿名內部類是一個沒有名字的內部類。它將進一步定義一個內部類以及創建一個內部類的實例。
內部類處理器可以使用匿名內部類進行代碼簡化。
匿名內部類的語法如下所示:
new SuperClassName/InterfaceName() { // Implement or override methods in superclass or interface // Other methods if necessary }
Since an anonymous inner class is a special kind of inner class, it is treated like an inner class
由於匿名內部類必須總是從一個父類繼承或者實現一個接口,但是它不能有顯式的extends或者implements子句。
一個匿名內部類必須實現父類或者接口中的所有抽象方法
一個匿名內部類總是使用它父類的無參構造方法來創建一個實例,如果一個匿名內部類實現一個接口,構造方法是Object()
一個匿名內部類被編譯成一個名為OuterClassName$n.class的類。如果外部類 Test 有兩個匿名的內部類,它們將會被編譯成Test$1.class 和Test$2.class.
二、lambda表達式
主要參考自:https://www.cnblogs.com/nnxud/p/9827704.html
1、簡介
lambda表達式可以用於極大簡化事件處理的代碼編寫。
lambda表達式是Java8的新特征,可以被看作使用精簡語法的匿名內部類。
觀察上面的lambda表達式發現引入了一個新的操作符 "->" 該操作符稱為箭頭操作符或 Lambda 操作符。
它將Lambda分為以下兩個部分
左側 : 指定Lambda表達式需要的參數列表
右側 : 制定了Lambda體,是抽象方法的實現邏輯,也既Lambda表達式要執行的功能
2、特征
可選類型聲明 : 不需要聲明參數類型,編譯器可以統一識別參數值
可選的參數圓括號 : 一個參數無需定義圓括號,但多個參數需要定義圓括號
可選的大括號 : 如果主體包含了一個語句,就不需要使用大括號
可選的返回關鍵字 : 如果主體只有一個表達式返回值則編譯器會自動返回值,大括號需要指定明表達式返回了一個數值
3、語法
先給出沒有使用lambda表達式之前,使用匿名內部類的寫法
//匿名內部類的寫法 @Test public void test() { Runnable runnable = new Runnable() { @Override public void run() { System.out.println("Hello Lambda!"); } }; runnable.run(); }
語法格式一 : 無參,無返回值
/** * 語法格式一:無參數,無返回值 * () -> System.out.println("Hello Lambda!"); */ @Test public void test1() { //“->”左邊只有一個小括號,表示無參數,右邊是Lambda體(就相當於實現了匿名內部類里面的方法了,(即就是一個可用的接口實現類了。)) Runnable runnable = ()->System.out.println("Hello Lambda!"); runnable.run(); }
語法格式二 : Lambda需要一個參數,但是沒有返回值
public static void test2() { Consumer<String> consumer = (String str) -> System.out.println(str); consumer.accept("Hello Lambda!"); }
語法格式三 : 數據類型可以省略,因為可由編譯器推斷得出,稱為"類型推斷"
public static void test3() { Consumer<String> consumer = (str) -> System.out.println(str); consumer.accept("Hello Lambda!"); }
語法格式四 : Lambda若需要一個參數時,參數的小括號可以省略
public static void test4() { Consumer<String> consumer = str -> { System.out.println(str) ;}; consumer.accept("Hello Lambda!"); }
語法格式五 : Lambda需要兩個或以上的參數,多條執行語句,並且可以有返回值
public static void test5() { Comparator<Integer> com = (x, y) -> { System.out.println("this is comparator"); return Integer.compare(x, y); }; int compare = com.compare(100, 244); System.out.println(compare); }
語法格式六 : 當Lambda體只有一條語句時,return與大括號若有,都可以省略
public static void test6() { Comparator<Integer> com = (x,y) -> Integer.compare(x,y); int compare = com.compare(100, 244); System.out.println(compare); }