一、Lambda表達式概述
Lambda表達式是Java8推出的新特性,是函數式程式設計的一種實作。通過配合函數式接口,可以使代碼更加的簡潔、明了,同時可以有效地減少代碼量。Lambda通常用在需要使用匿名内部類的地方。Lambda表達式的主要目的就是突出對象的操作和行為,而簡化其它不必要的步驟。它的一般形式如下:
List<String> list = Arrays.asList("A", "B", "C");
list.forEach(e -> System.out.println(e));
二、使用Lambda表達式
Java8中有一個
forEach
方法用來周遊集合中的元素,在未使用Lambda表達式時我們需要這樣使用:
list.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
可以看出
forEach
方法需要傳入一個對象作為參數,這個對象需要實作
Consumer
接口,在沒有使用Lambda表達式時,我們需要将整個的匿名類寫出來,代碼不夠簡潔。
1.Lambda表達式的第一種形式
list.forEach((String t) -> {
System.out.println(t);
});
可以看出,這種方式展現了Lambda的一般化形式,
(String t)
表示匿名内部類中的方法的參數(在Java8新特性之接口中我們提到過函數式接口中隻有一個抽象方法)以及參數類型,
->
可以看作是Lambda特有的表達式,用來将參數和代碼邏輯連接配接起來。
{}
中則是代碼邏輯。
2.Lambda表達式的簡化模式
在1中我們探讨了Lambda表達式的通用模式,但是使用起來還有有點複雜,那麼接下來我們繼續簡化Lambda。
在Java8中添加了類型推斷的特性,通過這一特性,我們就無需寫出參數的類型,這一工作将交給編譯器來完成。
list.forEach((t) -> {
System.out.println(t);
});
在隻有一個參數的情況下,()也可以去掉
list.forEach( t -> {
System.out.println(t);
});
在代碼邏輯較為簡單時,我們也可以這樣寫
list.forEach(t -> System.out.println(t));
3.擁有傳回值的Lambda表達式
list.sort(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return 0;
}
});
Java的List集合中有一個
sort
方法,它的參數是
Comparator
對象,裡面的
compare
方法需要傳回一個int類型的值。在擁有傳回值的情況下,Lambda表達式如何處理呢?
list.sort((e,t) ->{
return e.compareTo(t)
});
通常情形下,我們可以這樣寫。但是當代碼邏輯較為簡單時,比如上述情形,我們可以進一步簡化
//注意這種形式,不能加return關鍵字,return隻能在代碼塊{}中加
list.sort((e,t) ->e.compareTo(t));
Java編譯器會進行自動類型推斷,這種情形下,不需要也不能加return
注意:擁有兩個以上參數的時候需要寫成 (e,t,...)
這種形式
三、Lambda表達式的實際應用案例
1.建立線程對象
傳統方式
new Thread(new Runnable(){
@Override
public void run() {
System.out.println("hello");
}
}).start();
Lambda表達式
new Thread(() -> System.out.println("hello")).start();
2.數組排序
String[] str = {"A","BB","C"};
Arrays.sort(str, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return o1.length() - o2.length();
}
});
Arrays.sort(str, (o1,o2) -> o1.length() - o2.length());