定義:Lambda表達式可以理解爲簡潔地表示可傳遞的匿名函數的一種方式:它沒有名稱、有參數列表、函數主體、返回類型、可能還會有一個可以拋出的異常列表。
1 詳細解釋
- 1 匿名:因爲它不像普通方法那樣有一個明確名稱。
- 2 函數:因爲它不屬於某個特定的類,但是和方法一樣有參數列表、函數主體、返回類型、可能還會有一個可以拋出的異常列表。
- 3 傳遞:Lambda表達式可以作爲參數傳遞給方法或存儲在變量中。
- 4 簡潔:無需像匿名類那樣寫很多模板代碼。
2 Lambda表達式使用demo
public class Demo {
public static void main(String[] args) {
Comparator<Integer> comparator = new Comparator<Integer>() {
@Override
public int compare(Integer integer1, Integer integer2) {
return integer1.compareTo(integer2);
}
};
Comparator<Integer> comparatorWithLambda = (Integer integer1,Integer integer2) -> integer1.compareTo(integer2);
}
}
總結:同樣是實現一個比較器,如果用匿名內部類代碼量比較大,用Lambda表達只需要一行代碼就可以解決
2 lambda表達式語法
具體語法:(parameters) -> expression
或者 (parameters) -> {statements}
使用例子:
// 參數爲一個list 判斷它是否爲空並返回boolean值
(List<String> list) -> list.isEmpty()
// 返回一個List對象
() -> new ArrayList<String>(10)
//參數爲兩個整型計算他們的和並返回
(int a, int b) -> a * b
//顯示返回10
() -> {return 10;}
3 Java中在哪裏使用Lambda表達式
<1>函數式接口中使用: java中函數式接口是指只定義一個抽象方法的接口
//java存在很多的函數式接口,Runnable就是
public class Demo2 {
public static void init(Runnable runnable) {
runnable.run();
}
public static void main(String[] args) {
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("thread1");
}
};
Runnable r2 = () -> System.out.println("thread2");
init(r1);
init(r2);
init(() -> System.out.println("thread3"));
}
}
4 自定義函數式接口並且使用lambda表達式傳遞行爲
//功能,連續讀取一個文件的兩行內容
//定義一個函數式接口,用來返回文件內容
@FunctionalInterface
public interface BufferedReaderProcessor {
String process(BufferedReader bufferedReader) throws IOException;
}
//將函數式接口BufferedReaderProcessor 作爲處理文件方法的參數以此可以使用lambda表達式傳遞行爲
public class ProcessFile {
public static String processFile(BufferedReaderProcessor processor) throws IOException {
try (BufferedReader br = new BufferedReader(new FileReader("D:\\Pragram Files\\IdeaProjects\\javase\\src\\main\\java\\Java8\\chapter2_lambda\\lambda.txt"))) {
return processor.process(br);
}
}
public static void main(String[] args) throws IOException{
String line = processFile((BufferedReader br) -> br.readLine()+br.readLine());
System.out.println(line);
}
}
結果:
lambda -> great!lambda -> great2!
總結:這裏自己實現實現了一個函數式接口,然後通過lambda表達式傳遞讀取文件的行爲。可以很容易並且簡單地控制讀取的行數。
5 結合方法引用和lambda表達式(最終案例==>推薦)
- 使用場景:比較存放在List中的Apple的重量大小
//Apple類
public class Apple {
private Double weight;
public Double getWeight() {
return weight;
}
public void setWeight(Double weight) {
this.weight = weight;
}
}
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import static java.util.Comparator.*;
public class AppleCompare {
public static void main(String[] args) {
List<Apple> apples = new ArrayList<>();
//向List中放入四個蘋果
apples.add(new Apple(0.5));
apples.add(new Apple(0.3));
apples.add(new Apple(0.8));
apples.add(new Apple(0.6));
//比較重量 List提供了sort方法 public void sort(Comparator<? super E> c)接收一個函數表達式
// java8之前的做法 使用匿名內部類
// apples.sort(new Comparator<Apple>() {
// @Override
// public int compare(Apple o1, Apple o2) {
// return o1.getWeight().compareTo(o2.getWeight());
// }
// });
//
// System.out.println(apples);
//java8中使用lambda表達式和方法調用是最好的實踐策略
//這邊使用了lambda表達式
// apples.sort((a1,a2)-> a1.getWeight().compareTo(a2.getWeight()));
// System.out.println(apples);
//最終版使用lambda表達式和方法調用 Comparator提供了comparing靜態方法比較元素。
apples.sort(comparing(Apple::getWeight));
}
}