Java自學第9期——Lambda表示式
1、入門
使用場景:如果建立函式式介面(該介面的抽象方法只能有一個)的例項時,使用Lambda表示式更加簡潔方便。
2、格式:
(形參列表) -> { 程式碼塊 }
3、簡化
只有一個引數時,可以省略圓括號();
程式碼塊只有一條語句,可以省略花括號{};
程式碼塊裡只有一個語句時,即是需要return,也可以省略return關鍵字(僅僅是關鍵字),
需要返回值時自動返回這條省略了return的語句的值。
4、限制:
1、Lambda表示式的型別必須是函式式介面(不是的話可以強制型別轉換,但與目標型別的唯一抽象方法要有相同的形參列表);
2、Lambda表示式只能為函式式介面建立物件;
函式式介面典型例子:
XxxFunction\XxxConsumer\Predicate\XxxSupplier
3、java8為函式式介面提供了@FunctionalInterface註解,放在介面定義前面,告訴編譯器對該介面進行檢查是否為函式式介面。
public class Demo01 { //建立Runnable物件,Runnable是一個函式式介面 public static void main(String[] args) { Runnable r = ()-> System.out.println("Runnable"); Runnable r1 = () -> { for (int i = 0; i < 2; i++) { System.out.println(i); } };
5、補充
方法引用和構造器引用簡化寫法
條件:如果程式碼塊只有一條語句時,還可以進一步簡化lambda寫法。
1.引用類方法
格式: 類名::方法
說明: 介面中被實現方法的全部引數 傳給該類方法作引數。
2.引用特定物件的例項方法
格式: 特定物件::例項方法
說明: 介面中被實現方法的全部引數 傳給該類方法作引數。
3.引用某類物件的例項方法
格式: 類名::例項方法
說明: 介面中被實現方法的第一個引數作為呼叫者,剩餘引數作為該方法的引數
4.引用構造器
格式: 類名::new
說明: 介面中被實現方法的全部引數 傳給該構造器作引數。
//定義一個函式式介面 @FunctionalInterface interface Demo02 { //只有一個抽象方法convert() Integer convert(String from); } @FunctionalInterface interface Demo021{ String test(String a,int b,int c); } @FunctionalInterface interface Demo022{ JFrame win(String title); }
class Demo03{
public static void main(String[] args) {
//呼叫Integer類的valueOf方法
Demo02 obj1 = Integer::valueOf;
//呼叫"99"物件的indexOf()例項方法實現
Demo02 obj2 = "99"::indexOf;
//被實現方法的第一個引數作為呼叫者
//後面全部引數傳給該方法作引數
Demo021 obj3 = String::substring;
//構造器引用
Demo022 obj4 = JFrame::new;
}
}
6、區別
lambda表示式與匿名內部類的區別:
lambda表示式是匿名內部類的一種簡化,
-
相同點:
1、都可以直接訪問effectively final區域性變數以及外部類的成員變數(包括例項變數和類變數);
2、二者建立的物件都可以直接呼叫從介面中繼承的預設方法。 -
不同點:
1、匿名內部類可為任意介面建立例項,無論有多少抽象方法,lambda只能為函式式介面建立例項。
2、匿名內部類可以為抽象類或普通類建立例項,後者只能為函式式介面建立例項。
3、匿名內部類實現的抽象方法的方法體允許呼叫介面定義的預設方法,lambda表示式的程式碼塊不允許呼叫介面定義的預設方法。
下期介紹File類和IO流。