導言
Java 8 自帶函數式編程的支持,提供了函數式接口、Lambda 表達式、方法引用、流和並行等新特性。本文將圍繞函數式接口展開講述。
函數式接口
函數式接口指只包含一個抽象方法的接口。通過註解 @FunctionalInterface 可以告訴編譯器對該接口進行檢查,確保其符合函數式接口的定義。函數式接口可以使用 Lambda 表達式和方法引用兩種方式來創建對象。
創建函數式接口
@FunctionalInterface public interface MyFunctionalInterface { void doSomething(); }
使用Lambda表達式
MyFunctionalInterface myLambda = () -> { System.out.println("I'm a Lambda expression"); }; myLambda.doSomething();
上述代碼用 Lambda 表達式實現了 MyFunctionalInterface 接口中唯一的抽象方法 doSomething()。
使用方法引用
MyObject myObj = new MyObject(); MyFunctionalInterface myMethodRef = myObj::myMethod; myMethodRef.doSomething();
上述代碼使用方法引用創建了一個 MyFunctionalInterface 的實例。myObj::myMethod 表示使用 myObj 類的 myMethod 方法來實現 doSomething() 方法。
常用的函數式接口
Java 8 提供了許多常用的函數式接口,可以在 java.util.function 包中找到。下面介紹幾個最常用的函數式接口。
Consumer
Consumer 接口表示接收一個參數 T,沒有返回值。常用於對接口進行一個操作,不需要返回結果,如輸出信息、修改對象等。
Consumer printConsumer = System.out::println; printConsumer.accept("Hello World!");
Supplier
Supplier 接口表示沒有參數,返回一個結果 T。常用於獲取接口的某個數值等操作。
Supplier helloSupplier = () -> "Hello World!"; System.out.println(helloSupplier.get());
Function
Function 接口表示接收一個參數 T,返回一個結果 R。常用於對接口進行一定的轉換操作,如類型轉換、字符串轉換等。
Function strToInt = Integer::valueOf; int result = strToInt.apply("5"); System.out.println(result);
Predicate
Predicate 接口表示接收一個參數 T,返回一個 boolean 類型的值。常用於對接口進行一個判斷是否成立的操作,如校驗、過濾等。
Predicate startsWithJ = (s) -> s.startsWith("J"); boolean result = startsWithJ.test("Java"); System.out.println(result);
Lambda表達式和方法引用
Lambda 表達式和方法引用是函數式接口的創建方式,也是函數式編程的核心。Lambda 表達式可以理解為是一種匿名函數,可以傳遞到變量或方法中。方法引用表示使用現有方法實現函數式接口。下面簡要介紹 Lambda 表達式和方法引用。
Lambda表達式
Lambda 表達式定義如下:
(parameters) -> expression or statement block
可以分為以下幾種形式:
- 無參數:() -> expression
- 一個參數:(p) -> expression
- 多個參數:(p1, p2) -> expression or (p1, p2) -> { statement block }
示例:
Runnable r1 = () -> System.out.println("Hello World 1");
方法引用
方法引用是使用 :: 來表示的。
- 對象引用:object::method
- 靜態方法引用:Class::method
- 特定類的任意對象方法引用:Class::method
- 構造函數引用:Class::new
示例:
Consumer printConsumer = System.out::println;
流和並行
Java 8 引入了流的概念(java.util.stream),在對集合進行操作時可以使用流來實現,可以使用多核處理器來加速計算。流的特點是能進行過濾、映射、排序、歸約等複雜的操作,通過流式編程可以使代碼更加簡潔。
使用流時,可以選擇串行流或並行流,前者適用於數據量小的情況,後者適用於數據量大的情況:
List list = Arrays.asList("a1", "a2", "b1", "c2", "c1"); //串行流 list.stream() .filter(s -> s.startsWith("c")) .map(String::toUpperCase) .sorted() .forEach(System.out::println); //並行流 list.parallelStream() .filter(s -> s.startsWith("c")) .map(String::toUpperCase) .sorted() .forEach(System.out::println);
總結
本文介紹了 Java 8 函數式編程中最常用的函數式接口、Lambda 表達式和方法引用、流和並行。使用函數式接口可以使代碼更加簡潔,並且可以使用 Lambda 表達式和方法引用來創建函數式接口實例,使代碼更加易於理解。流和並行是函數式編程的核心,可以使用流來實現複雜的操作並提高計算速度。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/189220.html