Lambda表達式和匿名內部類的異同
阿新 • • 發佈:2018-04-06
只有一個 lam fec system 一個 turn def () RR
Lambda表達式和匿名內部類的相同點:
- 都可以直接訪問成員變量,effectively final變量
- Lambda表達式返回的對象和匿名內部類創建的對象一樣,可以調用繼承自接口的default方法。
Lambda表達式和匿名內部類的不同點:
- Lambda表達式只能為函數式接口創建對象,函數式接口只有一個抽象方法,而匿名內部類可以為普通類或任意接口創建對象,接口可以包含多個抽獎方法。
- Lambda表達式的代碼塊內不能調用繼承自接口的default方法,而匿名內部類實現的抽象方法的方法體內可以調用接口的default方法。
1 public class LambdaTest {2 3 public static void main(String[] args) { 4 //下面是effectively final 變量 5 int a=10; 6 count c1 = new count(){ 7 @Override 8 public void printer() { 9 //訪問effectively final 變量 10 System.out.println("匿名內部類 訪問了effectively final 變量"+a);11 //實現的抽象方法內調用接口default方法:add() 12 System.out.println(add(1,2)); 13 } 14 }; 15 c1.printer(); 16 17 count c2=()->System.out.println("Lambda表達式 訪問了 effectively final 變量"+a); 18 c2.printer(); 19 //只能通過Lambda表達式對象調用接口的default方法20 int sum = c2.add(1, 2); 21 System.out.println(sum); 22 } 23 } 24 25 interface count{ 26 void printer(); 27 default int add(int a,int b){ 28 return a+b; 29 } 30 }
Lambda表達式和匿名內部類的異同