一眼看懂Lambda表達式


Lambda 表達式是 JDK8 的一個新特性,可以取代大部分的匿名內部類,寫出更優雅的 Java 代碼,尤其在集合的遍歷和其他集合操作中,可以極大地優化代碼結構。
Lambda的新特性:

  1. Lambda 表達式,也可稱爲閉包,它是推動 Java 8 發佈的最重要新特性。
  2. Lambda 允許把函數作爲一個方法的參數(函數作爲參數傳遞進方法中)。
  3. 使用 Lambda 表達式可以使代碼變的更加簡潔緊湊。

Lambda的重要特徵:

  • 可選類型聲明:不需要聲明參數類型,編譯器可以統一識別參數值。
  • 可選的參數圓括號:一個參數無需定義圓括號,但多個參數需要定義圓括號。
  • 可選的大括號:如果主體包含了一個語句,就不需要使用大括號。
  • 可選的返回關鍵字:如果主體只有一個表達式返回值則編譯器會自動返回值,大括號需要指定明表達式返回了一個數值。

Lambda 基礎語法

/**多個參數有返回值*/
@FunctionalInterface
public interface ReturnMultiParam {
    int method(int a, int b);
}

@FunctionalInterface
飾函數式接口的,要求接口中的抽象方法只有一個。 這個註解往往會和 lambda 表達式一起出現。

語法形式爲 () -> {},其中 () 用來描述參數列表,{} 用來描述方法體,-> 爲 lambda運算符 ,讀作(goes to)。

Lambda 語法簡化

對應的方法調用爲:

   //多個參數有返回值
        ReturnMultiParam returnMultiParam = (int a, int b) -> {
            System.out.println("ReturnMultiParam param:" + "{" + a + "," + b +"}");
            return 1;
        };
        int res3 = returnMultiParam.method(6, 8);

方法還可以進步簡潔:

1. 只有一個參數可以省略括號  (int a) >> a  ,且省略參數類型
2. 如果方法體中只有一個語句,則可以省略括號   
   ReturnMultiParam returnMultiParam =  a ->System.out.println("ReturnMultiParam param:" + a);
3. 如上是省略大括號的 有return值的 表達式
   ReturnMultiParam returnMultiParam =  a -> 1 + a;
4. //lambda4 引用了已經實現的 addTwo 方法
   Exe1 exe = new Exe1();
   ReturnOneParam lambda4 = exe::addTwo; // 調用非靜態方法
   ReturnOneParam lambda5 = Exe1 ::addTwo2; // 調用靜態方法

構造方法的引用

   interface ItemCreatorParamContruct {
        Item getItem(int id, String name, double price);
    }

構造方法的Lambda使用:

        ItemCreatorParamContruct creator3 = Item::new;
        Item item3 = creator3.getItem(112, "鼠標", 135.99);

等價於常規的表達式

  ItemCreatorParamContruct creator4 = new ItemCreatorParamContruct() {
            @Override
            public Item getItem(int id, String name, double price) {
                return new Item(id, name, price);
            }
        };
        creator4.getItem(112, "鼠標", 135.99);

集合的使用

  1. 集合的遍歷
      @RequiresApi(api = Build.VERSION_CODES.N)
        ArrayList<Integer> list = new ArrayList<>();
        //lambda表達式 方法引用
        list.forEach(System.out::println);
        list.forEach(element -> {
            if (element % 2 == 0) {
                System.out.println(element);
            }
        });
  1. 刪除集合中元素
    ArrayList<Item> items = new ArrayList<>();
    items.removeIf(ele -> ele.getId() == 7);
  1. 集合內元素的排序
     ArrayList<Item> list = new ArrayList<>();
     list.sort((o1, o2) -> o1.getId() - o2.getId());

推薦鏈接:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章