【簡述】
Lambda表達式是匿名內部類的一種簡化,因此它可以取代匿名內部類的作用。
【Lambda表達式與匿名內部類的 相同點】
1.Lambda表達式和匿名內部類一樣,都可以直接訪問"effectively final"的局部變量,以及外部類的成員變量(包括實力變量和類變量)
2.Lambda表達式創建的對象和匿名內部類創建的對象一樣,都可以直接調用從接口中繼承的默認方法。
【相同點的實例】
package com.Higgn.Lambda; @FunctionalInterface interface Displayable{ public void display(); default int add(int a,int b){ return a+b; } } class LambdaAndInner{ private int age=10; private static String name="Higgin"; public void test(){ String book="《java編程思想》"; Displayable dis=()->{ //訪問"effectively final"局部變量 System.out.println("book局部變量為:"+book); //訪問外部類的實力變量和類變量 System.out.println("外部類的實例變量age:"+age); System.out.println("外部類的類變量name:"+name); }; dis.display(); //調用dis對象從接口中繼承的add()方法 System.out.println(dis.add(10, 20)); } } public class TestDemo { public static void main(String[] args) { LambdaAndInner lai=new LambdaAndInner(); lai.test(); } }
【運行結果】

【Lambda表達式與匿名內部類的 區別】
1.匿名內部類可以為任意接口創建實例——不管有多少個抽象方法,只要匿名內部類實現了所有方法即可。
但是Lambda表達式只能為函數式接口創建實例。
2.匿名內部類可以為抽象類甚至普通類創創建實例,
但lambda表達式只能為函數式接口創建實例。
3.匿名內部類實現的抽象方法體允許調用接口中的默認方法,
但Lambda表達式的代碼塊不允許調用接口中的默認方法。
