一、Lambda表達式簡介
Lambda表達式是JDK8新加入的一個特性,它是一種新的語言元素,它將匿名函數作為一等公民看待,可以像傳遞變量一樣將它作為參數傳遞、作為返回值返回、賦值給變量等。Lambda表達式的定義形式為:參數列表 -> 函數體。
例如:
int result = Arrays.asList("apple", "banana", "orange").stream() .filter(str -> str.length() > 5) .mapToInt(String::length) .sum();
上述代碼中,Lambda表達式 str -> str.length() > 5 就是過濾條件。
二、Lambda表達式的語法
Lambda表達式的語法包括3個部分:參數列表、箭頭符號和函數體,具體詳解如下:
- 參數列表:表示該Lambda表達式接收哪些參數。可以為空,也可以包含且只包含一個參數、多個參數,參數類型可以明確指定(如:String str)或根據上下文自動推斷出來。
- 箭頭符號:表示下文所要執行的操作。即原來匿名類的方法體,複製左側參數列表到右側所要執行的操作,中間使用 -> 符號隔開
- 函數體:表示Lambda表達式的執行體,可以是一條語句、一組語句、或者一個表達式。
例如:
// 無參數的Lambda表達式 Runnable r = () -> { System.out.println("Hello Lambda!"); }; // 一個參數的Lambda表達式 Consumer c = (str) -> System.out.println("Hello " + str); // 多個參數的Lambda表達式 Comparator comp = (x, y) -> { if (x y) { return 1; } else { return 0; } };
三、Lambda表達式的應用
1、Lambda表達式與集合
Lambda表達式在集合中的應用十分廣泛,可以用來實現各種集合相關的功能,例如過濾、遍歷、計算、排序等。以下是一些示例代碼:
1.1 過濾
List fruits = Arrays.asList("apple", "banana", "peach", "cherry", "orange"); // 使用Lambda表達式過濾字符串列表中長度大於5的元素 List result1 = fruits.stream().filter(str -> str.length() > 5).collect(Collectors.toList()); // 使用Lambda表達式過濾整數列表中大於50的元素 List nums = Arrays.asList(10, 20, 30, 40, 50, 60, 70, 80, 90, 100); List result2 = nums.stream().filter(num -> num > 50).collect(Collectors.toList());
1.2 遍歷
List fruits = Arrays.asList("apple", "banana", "peach", "cherry", "orange"); // 使用Lambda表達式遍歷字符串列表 fruits.forEach(str -> System.out.println(str)); // 使用Lambda表達式遍歷整數列表 List nums = Arrays.asList(10, 20, 30, 40, 50, 60, 70, 80, 90, 100); nums.forEach(num -> System.out.println(num));
1.3 計算
// 使用Lambda表達式計算整數列表中元素的和 List nums = Arrays.asList(1, 2, 3, 4, 5); int sum = nums.stream().mapToInt(num -> num).sum(); // 使用Lambda表達式計算字符串列表中所有元素的長度總和 List fruits = Arrays.asList("apple", "banana", "peach", "cherry", "orange"); int lengthSum = fruits.stream().mapToInt(str -> str.length()).sum();
1.4 排序
List fruits = Arrays.asList("apple", "banana", "peach", "cherry", "orange"); // 使用Lambda表達式對字符串列表進行排序 List result1 = fruits.stream().sorted((s1, s2) -> s1.compareTo(s2)).collect(Collectors.toList()); List nums = Arrays.asList(10, 5, 20, 30, 15, 25); // 使用Lambda表達式對整數列表進行排序 List result2 = nums.stream().sorted((n1, n2) -> { if (n1 n2) { return 1; } else { return 0; } }).collect(Collectors.toList());
2、Lambda表達式與函數式接口
函數式接口是一個只包含一個抽象方法的接口,可以通過Lambda表達式實現該接口中的抽象方法,並將Lambda表達式賦值給該接口的實例變量,從而實現函數式編程。
例如java.util.function包中提供了很多常用的函數式接口,例如:Function、Supplier、Consumer、Predicate等。其中Function用於將輸入轉換為輸出,Supplier用於提供輸出,Consumer用於處理輸入,Predicate用於判斷是否符合條件。
以下是一些示例代碼:
2.1 Function接口
// 將整數轉換成字符串 Function f1 = num -> String.valueOf(num); // 將字符串轉換成整數 Function f2 = str -> Integer.parseInt(str); // 計算字符串長度並返回對應的整數 Function f3 = str -> str.length();
2.2 Supplier接口
// 提供當前時間的Supplier接口實現 Supplier s1 = () -> new Date(); // 提供一個隨機數的Supplier接口實現 Supplier s2 = () -> new Random().nextInt(100);
2.3 Consumer接口
// 輸出整數列表中所有元素 Consumer<List> c1 = list -> { for (Integer num : list) { System.out.println(num); } }; // 輸出字符串列表中所有元素 Consumer<List> c2 = list -> { for (String str : list) { System.out.println(str); } };
2.4 Predicate接口
// 判斷字符串是否為空 Predicate p1 = str -> str == null || str.isEmpty(); // 判斷整數是否是偶數 Predicate p2 = num -> num % 2 == 0;
四、Lambda表達式的優缺點
1、優點
- 簡化代碼:Lambda表達式可以讓代碼更加簡潔、易讀,避免了冗長的匿名類形式;
- 提高可讀性:Lambda表達式的語法更加緊湊、易於理解,可以更好地表達代碼的意圖;
- 提高靈活性:Lambda表達式的功能更加靈活,可以方便地傳遞方法引用、參數等。
2、缺點
- 缺乏可讀性:Lambda表達式中的箭頭符號和參數列表可能會使代碼難以理解;
- 不易調試:Lambda表達式中的代碼不容易調試,一旦出現錯誤需要非常小心地排查;
- 性能問題:Lambda表達式在執行時可能會帶來一些性能問題,但可以通過編寫高效的Lambda表達式來避免。
五、總結
Lambda表達式是JDK8中一個很重要的特性,可以用來簡化代碼、提高可讀性、提高靈活性等。需要注意的是,Lambda表達式雖然帶來了許多好處,但也存在一些缺點,需要根據實際情況進行選擇。
原創文章,作者:RWWC,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/148056.html