一文帶你掌握Java8中Lambda表達式 函數式接口及方法構造器數組的引用
函數式接口概述
隻包含一個抽象方法的接口,稱為函數式接口。
可以通過 Lambda 表達式來創建該接口的對象。
可以在一個接口上使用 @FunctionalInterface
註解,這樣做可以檢查它是否是一個函數式接口。同時 javadoc 也會包含一條聲明,說明這個接口是一個函數式接口。
在java.util.function包下定義瞭Java 8 的豐富的函數式接口。
在函數式編程語言當中,函數被當做一等公民對待。在將函數作為一等公民的編程語言中,Lambda表達式的類型是函數。但是在Java8中,有所不同。在Java8中,Lambda表達式是對象,而不是函數,它們必須依附於一類特別的對象類型——函數式接口。
簡單的說,在Java8中,Lambda表達式就是一個函數式接口的實例。這就是Lambda表達式和函數式接口的關系。也就是說,隻要一個對象是函數式接口的實例,那麼該對象就可以用Lambda表達式來表示。所以用匿名實現類表示的現在都可以用Lambda表達式來寫。
函數式接口示例
1、Runnable接口
2、自定義函數式接口
@FunctionalInterface public interface MyFunctional01{ public String getValue(); } //使用泛型 @FunctionalInterface public interface MyFunctional02<T>{ public T getValue(T t); }
3、作為參數傳遞 Lambda 表達式
public class LambdaTest { public static void main(String[] args) { String newStr = toUpperString(str -> str.toUpperCase(),"abcDEf"); System.out.println(newStr); } public static String toUpperString(MyFunc<String> my,String str){ return my.getValue(str); } } @FunctionalInterface interface MyFunc<T>{ public T getValue(T t); }
內置函數式接口
import java.util.function.Consumer; /** * @Author: Yeman * @Date: 2021-10-03-22:50 * @Description: */ public class LambdaTest { public static void main(String[] args) { Consumer<Integer> consumer = i -> System.out.println(i); consumer.accept(9); } }
Lambda簡述
Lambda 是一個匿名函數,我們可以把 Lambda 表達式理解為是一段可以傳遞的代碼(將代碼像數據一樣進行傳遞)。使用它可以寫出更簡潔、更靈活的代碼。作為一種更緊湊的代碼風格,使Java的語言表達能力得到瞭提升。
其本質是作為函數式接口(隻有一個抽象方法)的實例。
Lambda 表達式:在Java 8 語言中引入的一種新的語法元素和操作符。這個操作符為 “->”
, 該操作符被稱為 Lambda 操作符或箭頭操作符。它將 Lambda 分為兩個部分:
①左側:指定瞭 Lambda 表達式需要的參數列表。
②右側:指定瞭 Lambda 體,是抽象方法的方法體。
Lambda語法
1、無參,無返回值
public class LambdaTest { public static void main(String[] args) { //未使用Lambda表達式 Runnable runnable1 = new Runnable() { @Override public void run() { System.out.println("這是第一個語法!"); } }; runnable1.run(); System.out.println("======================"); //使用Lambda表達式 Runnable runnable2 = () -> { System.out.println("這是用瞭Lambda表達式的一個語法!"); }; runnable2.run(); } }
2、一個參數,無返回值
3、數據類型可以省略,因為可由編譯器推斷得出,稱為“類型推斷”
4、Lambda 若隻需要一個參數時,參數的小括號可以省略
5、Lambda 需要兩個或以上的參數,多條執行語句,並且可以有返回值
6、當 Lambda 體隻有一條語句時,return 與大括號若有,都可以省略
方法引用
當要傳遞給Lambda體的操作,已經有實現的方法瞭,可以使用方法引用。
方法引用可以看做是Lambda表達式深層次的表達。換句話說,方法引用就是Lambda表達式,也就是函數式接口的一個實例,通過方法的名字來指向一個方法,可以認為是Lambda表達式的一個語法糖。
要求:實現接口的抽象方法的參數列表和返回值類型,必須與方法引用的方法的參數列表和返回值類型保持一致。
格式:使用操作符 “::
” 將類(或對象)與方法名分隔開。
如下三種主要使用情況:
①對象::非靜態方法名
②類::靜態方法名
③類::非靜態方法名
示例:
import java.util.Comparator; import java.util.function.Consumer; /** * @Author: Yeman * @Date: 2021-10-03-22:50 * @Description: */ public class LambdaTest { public static void main(String[] args) { Consumer<Integer> consumer = i -> System.out.println(i); consumer.accept(9); Consumer<String> stringConsumer = System.out :: println; stringConsumer.accept("Hello"); Comparator<Integer> comparable = (x, y) -> Integer.compare(x,y); System.out.println(comparable.compare(2,9)); Comparator<Integer> integerComparator = Integer :: compare; System.out.println(integerComparator.compare(9,2)); } }
構造器引用
格式:ClassName::new
與函數式接口相結合,自動與函數式接口中方法兼容。可以把構造器引用賦值給定義的方法,要求構造器參數列表要與接口中抽象方法的參數列表一致,且方法的返回值即為構造器對應類的對象。
數組引用
可以將數組看作一個類,則數組引用就類似於構造器引用。
格式:type[] :: new
import java.util.function.Function; /** * @Author: Yeman * @Date: 2021-10-03-22:50 * @Description: */ public class LambdaTest { public static void main(String[] args) { Function<Integer,String[]> function = length -> new String[length]; String[] apply = function.apply(3); System.out.println(apply[2]); System.out.println("================"); Function<Integer,String[]> function1 = String[] :: new; System.out.println(function1.apply(5)); } }
到此這篇關於一文帶你掌握Java8中Lambda表達式 函數式接口及方法構造器數組的引用的文章就介紹到這瞭,更多相關Java Lambda表達式內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 關於Java 中的 Lambda 表達式
- 關於JavaEE匿名內部類和Lambda表達式的註意事項
- Java8的Lambda表達式你真的會嗎
- Java中Lambda表達式用法介紹
- Java常用函數式接口總結