JDK8之Lambda表達式詳解

1.1概述

​ Lambda 表達式(lambda expression)是一個匿名函數。主要用來優化匿名內部類的結構。我們先看下傳統的匿名內部類的使用方式。

new Thread(new Runnable() {
  @Override
  public void run() {
   System.out.println("有一個線程即將執行。");
  }
}).start();

這是一個開啓線程的案例,在這個案例中,這個Runnable的匿名實現類中,我們關注的其實只有裏面的實現邏輯System.out.println("有一個線程即將執行。"),但整體代碼顯得非常繁瑣跟冗餘。JDK8提供了Lambda表達式來簡化匿名內部類的寫法,語法更加簡潔,如下

new Thread(()->System.out.println("有一個線程即將執行。")).start();

1.2 標準格式

Lambda表達式的語法爲:

([參數列表]) ->{
  代碼體;
}

無參的代碼演示

public class DemoLambda {

   public static void main(String[] args) {
    Drinkable drinkable = ()->{
    System.out.println("大口的喝...");
   };

   drinkable.drink();

 }
}

interface Drinkable{
  void drink(); //無參
}

有參的代碼演示

public class DemoLambda {

  public static void main(String[] args) {
    Eatable eatable = (food)->{
    System.out.println("大口的喫"+food);
    return "喫飽了";
    };

    String result = eatable.eat("羊肉");
    System.out.println(result);

}
}

interface Eatable{
  String eat(String food);//有參
}

1.3 省略模式

​ 在lambda標準格式的基礎上,可以使用省略寫法的規則:

  • 參數類型可以省略

  • 如果參數有且僅有一個,則小括號可以省略

  • 如果方法體中有且僅有一句代碼,可以同時省略大括號、return關鍵字以及分號。

    如常規表達式爲

(i)->{ return i+i; }

省略模式後爲

i->i+i 

1.4 使用限制

lambda表達式使用有幾個條件需要特別注意:

  • lambda表達式是針對接口才能使用
  • 接口中必須有且僅有一個抽象方法,能被@FunctionalInterface註解修飾的方法

1.5 常用的內置函數接口

lambda表達式是針對接口的,有且僅有一個抽象方法,這種接口稱爲函數接口。lambda表達式使用時不關心接口名、抽象方法名,只關心抽象方法的參數列表和返回類型。因此JDK8提供了大量的常用的函數式接口。

​ 這些函數接口都在java.util.function包下,常用接口有Supplier接口、Consumer接口、Function接口、Predicate接口。

1.5.1 Supplier接口

java.util.function.Supplier<T>接口,它表示”供給“,對應的lambda表達式需要對外提供一個符合泛型類型的對象數據。

@FunctionalInterface
public interface Supplier<T> {
T get();
}

代碼演示

public class Demo04FunctionReference {

   public static void main(String[] args) {
      Supplier<Integer> supplier = ()->{
      return new Random().nextInt();
   };

    Integer result = supplier.get();
    System.out.println("隨機產生一個整數: "+result);
  }
}

1.5.2 Consumer接口

java.util.function.Consumer<T> 接口用來表示“消費”一個數據,數據類型有泛型決定。

@FunctionalInterface 
public interface Consumer<T> {
void accept(T t);
}

代碼演示

//小寫字符串轉成大寫字符串 
Consumer<String> consumer = (s)->{
System.out.println(s.toUpperCase());
};
consumer.accept("hello blb!");

1.5.3 Function接口

java.util.function.Function<T, R> 接口用來根據一個類型的數據得到另一個類型的數據,前者稱爲前置條件,後者稱爲後置條件,有參數有返回。

@FunctionalInterface
public interface Function<T, R> {
 R apply(T t);
}

代碼演示

//將字符串轉成數字 
Function<String,Integer> function = (s)->{
return Integer.parseInt(s);
};
System.out.println(function.apply("123"));

1.5.4 Predicate接口

java.util.function.Predicate<T> 接口用來對某種類型的數據進行判斷,從而得到一個boolean類型的結果。

@FunctionalInterface
public interface Predicate<T> {
  boolean test(T t);
}

代碼演示

 //判斷一個整數是否是偶數
 Predicate<Integer> predicate = (i)->{
   return i%2==0;
 };
 System.out.println("是否是整數:"+predicate.test(18));

至此:Lambda表達式總結完了!

   好文引自: https://blog.csdn.net/zykwblx/article/details/125959421

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