Java 匿名類和lambda表達式


一、匿名內部類

一個匿名內部類是一個沒有名字的內部類。它將進一步定義一個內部類以及創建一個內部類的實例。

內部類處理器可以使用匿名內部類進行代碼簡化。

 

 匿名內部類的語法如下所示:

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);
    }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM