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