# 匿名內部類別&Lambda ## 匿名內部類別 *產生一個匿名的類別來實現某個介面或繼承某個類別,立即創建出實例。* 因此,在不需要撰寫許多類別,且每個類別實際上並**沒有大量的被使用在多個地方或經過一段複雜的運算時**,可以利用匿名內部類別來處理。 因為也屬於內部類別,所以匿名內部類別可以引用外部方法的變數,實際上是拷貝該變數的數值到匿名內部類別中,該變數必須加上 `final` 修飾詞(沒加上 Java 會自動加上),否則會導致拷貝的值前後不一致,**但參考資料是拷貝位址,修改參考資料內容不會影響位址,因此可以修改**。 >匿名內部類別還是會產生類別,不過是由系統自動命名。 ```[java]= // Main.java public class Main { public static void main(String[] args) { int a = 1; int b = 2; // 匿名內部類別 System.out.println(new Comparator(){ @Override public int accept(int i1, int i2){ return i1 - i2; } }.accept(a, b)); } } ``` ```[java]= // Comparator.java public interface Comparator { int accept(int i1, int i2); } ``` *** ## Lambda 表示式 替代匿名內部類別的繁瑣寫法,簡化程式碼並且改善效能問題。 **重點,只能使用於只有一個抽象方法的介面,這類型的介面我們又稱做函式介面(FunctionalInterface),此介面裡面會寫上 `@FunctionalInterface` 作為標示。** ### 寫法 參數用 `()`,內容用 `{}`,回傳一樣用 `return`。 ```[java]= // Comparator @FunctionalInterface public interface Comparator { int accept(int i1, int i2); } ``` ```[java]= // Main.java public class Main { public static void main(String[] args) { int a = 1; int b = 2; // 匿名內部類別 System.out.println(new Comparator() { @Override public int accept(int i1, int i2) { return i1 - i2; } }.accept(a, b)); // Lambda Comparator c = (i1, i2) -> i1 - i2; System.out.println(c.accept(a, b)); // 強制轉型 System.out.println(((Comparator) (i1, i2) -> i1 - i2).accept(a, b)); } } ``` *** ## 方法引用 - 待補 // TODO