一、Lambada表達式概述
Lambada表達式是Java 8引入的一個新特性,可以簡化代碼並使代碼更加易讀。使用Lambada表達式可以將一個方法作為參數傳遞給方法,或者將代碼塊作為參數傳遞給方法。在Lambada表達式內可以使用箭頭運算符「->」,左側為方法參數,右側為方法體。
Comparator comparator = (a, b) -> a - b;
上述代碼創建了一個Comparator對象,使用Lambada表達式實現了compare方法。在比較兩個整數時,返回它們的差值。
二、Lambada表達式實現介面
Lambada表達式一般用於實現只有一個方法的介面,這種介面也被稱為函數式介面。實現函數式介面的常用方法是使用匿名內部類,但Lambada表達式更加簡潔明了。
@FunctionalInterface public interface Calculator { int add(int a, int b); } public class CalculatorTest { public static void main(String[] args) { Calculator calculator = (a, b) -> a + b; System.out.println(calculator.add(1, 2)); // 輸出結果為3 } }
上述代碼中,Calculator是一個函數式介面,使用Lambada表達式實現了add方法。在CalculatorTest類中創建了Calculator對象,使用Lambada表達式的方式實現了add方法。可以看到,使用Lambada表達式的方式比使用匿名內部類的方式更加簡潔。
三、Lambada表達式的變數作用域
Lambada表達式中的變數作用域與匿名內部類的作用域類似,可以訪問當前方法中的final變數,以及實例變數和靜態變數。
public class LambdaScopeTest { final int num = 1; // final變數可以被Lambada表達式訪問 static int staticNum = 2; // 靜態變數可以被Lambada表達式訪問 int instanceNum = 3; // 實例變數可以被Lambada表達式訪問 public void testScope() { int tempNum = 4; // 局部變數在Lambada表達式中必須是final的 Consumer consumer = (num) -> { System.out.println("final變數:" + this.num); System.out.println("靜態變數:" + staticNum); System.out.println("實例變數:" + instanceNum); System.out.println("局部變數:" + tempNum); }; consumer.accept(num); } public static void main(String[] args) { new LambdaScopeTest().testScope(); } }
上述代碼創建了一個LambdaScopeTest類,定義了final、靜態、實例和局部四種類型的變數,然後在testScope方法中使用Lambada表達式訪問這些變數。可以看到,Lambada表達式可以訪問final變數、靜態變數和實例變數,但在Lambada表達式內定義的局部變數必須是final的。
四、Lambada表達式的方法引用
Lambada表達式中也可以使用方法引用的方式來代替代碼塊。使用方法引用可以簡化代碼並增強可讀性。
public class MethodReferenceTest { public static void print(String s) { System.out.println(s); } public void testMethodReference() { Consumer consumer1 = (s) -> System.out.println(s); Consumer consumer2 = System.out::println; Consumer consumer3 = MethodReferenceTest::print; consumer1.accept("Lambada表達式"); consumer2.accept("方法引用"); consumer3.accept("靜態方法引用"); } public static void main(String[] args) { new MethodReferenceTest().testMethodReference(); } }
上述代碼創建了一個MethodReferenceTest類,其中定義了一個靜態方法print。在testMethodReference方法中,使用Lambada表達式和方法引用的方式來調用print方法。可以看到,使用方法引用的方式比使用Lambada表達式的方式更加簡潔明了。
五、Lambada表達式與Stream API
Lambada表達式常常與Stream API一起使用,可以實現對集合類對象的操作。Stream API可以以管道的方式對集合類對象進行處理,當需要對集合類對象進行篩選、排序、分組等操作時,Lambada表達式和Stream API可以快速地完成這些操作。
public class StreamTest { public static void main(String[] args) { List list = Arrays.asList(1, 3, 2, 4, 5, 6, 7, 8, 9); list.stream() .filter(i -> i % 2 == 0) // 篩選偶數 .sorted() // 排序 .map(i -> "數字:" + i) // 轉換成字元串 .forEach(System.out::println); // 輸出結果 } }
上述代碼使用了Stream API和Lambada表達式來對Integer型數組進行處理。首先使用filter方法篩選出偶數,然後使用sorted方法進行排序,之後使用map方法將數字轉換為字元串。最後使用forEach方法輸出篩選、排序、轉換後的結果。
六、Lambada表達式與多線程
Lambada表達式在實現多線程程序時也有很好的支持。在Runnable介面中只有一個run方法,可以使用Lambada表達式的方式實現,可以將多線程的代碼量縮減到最小。
public class ThreadTest { public static void main(String[] args) { new Thread(() -> System.out.println("Lambada表達式實現多線程")).start(); } }
上述代碼使用了Lambada表達式的方式實現了Runnable介面,輸出一條信息。可以看到,通過使用Lambada表達式的方式實現Runnable介面,相比使用匿名內部類的方式,代碼量大大減少。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/294187.html