java8中的lambda表达式实用详解
java8中的lambda表達式實用詳解
1. lambda簡介
? Lambda 表達式(lambda expression)是一個匿名函數,Lambda表達式基于數學中的λ演算得名,直接對應于其中的lambda抽象(lambda abstraction),是一個匿名函數,即沒有函數名的函數。Lambda表達式可以表示閉包(注意和數學傳統意義上的不同)。Lambda表達式是Java8中的新特性,編碼一般是盡可能輕量級的將代碼封裝為數據,傳統的解決方案是通過接口和實現類(匿名內部類)實現,這種方式存在語法冗余,this關鍵字,變量捕捉,數據控制等問題lambda概述
2. lambda特點
-
Lambda表達式理解為一段可以傳遞的代碼,可以寫出更簡潔、更靈活的代碼。
-
使代碼更簡潔,緊湊
-
可以使用并行流來并行處理,充分利用多核CPU的優勢,有利于JIT編譯器對代碼進行優化
3. lambda經典案列
- 線程創建的兩種方式:繼承Thread方式、實現Runnable方式
- 匿名內部方式創建一個線程
Tread類傳遞了一個匿名的Runnable對象,重載Runnable接口的run()方法來實現相應邏輯。
public static void main(String[] args) {Thread thread = new Thread(new Runnable() {@Override //重寫Runnable接口里面的run()方法public void run() {System.out.println("匿名內部類方式--線程1");}});thread.start(); //啟動線程 }- Lambda表達式創建一個線程
4.lambda語法格式
4.1 Lambda表達式的標準語法格式
Lambda表達式就是對函數式接口中抽象方法的實現,是對其匿名內部類的一個簡寫,只保留了方法的參數列表和方法體,其他的成分可以省略。因此,Lambda表達式的格式非常簡潔,只有三部分組成:
- 參數:指定了Lambda表達式需要的所有參數,如果有多個參數,參數之間用逗號隔開;如果沒有參數,留空即可
- 箭頭:由英文中畫線和大于符號組成,固定寫法。代表指向動作
- 方法體:Lambda表達式要執行的功能,具體的代碼方法內容
注:
- 可選類型聲明:不需要聲明參數類型,編譯器可以統一識別參數值。
- 可選的參數圓括號:一個參數無需定義圓括號,但無參數或多個參數需要定義圓括號。
- 可選的大括號:如果主體包含了一個語句,就不需要使用大括號。
- 可選的返回關鍵字:如果主體只有一個表達式返回值則編譯器會自動返回值,大括號需要指定明表達式返回了一個數值。
4.2 Lambda表達式省略語法格式
在Lambda標準語法格式的基礎上,可以使用省略寫法的規則:
- 若小括號內參數只有一個可以省略。
- 若小括號內沒有參數或有兩個及以上的參數,則 小括號不能省略。
- 若大括號內只有一條語句,無論是否有返回值,大括號、return關鍵字、分號可以省略。
**口訣:**左右遇一括號省,左側推斷類型省,能省則省。
5. 方法引用
方法引用的三種形式
-
類 :: 靜態方法
-
類 :: 非靜態方法
-
對象 :: 非靜態方法
注:
方法引用規定,對象不能調用靜態方法,這和面向對象的思想一致。但類可以調用非靜態方法,這是面向對象中不允許的。
5.1 類引用靜態方法
語法格式:類::靜態方法名
public static void main(String[] args) {Comparator<Integer> comparable= Integer::compare;//使用方法引用實現相同效果Comparator<Integer> integerComparable=Integer::compare;System.out.println(integerComparable.compare(2,1));System.out.println(comparable.compare(2,1)); }//結果 1 15.2 類引用普通方法
語法格式:類::實例方法名
public static void main(String[] args) {BiPredicate<String, String> biPredicate = String::equals;//使用方法引用實現相同效果BiPredicate<String, String> bp2 = String::equals;System.out.println(biPredicate.test("1", "2"));System.out.println(biPredicate.test("1", "2")); }//結果 false false5.3 對象引用非靜態方法
語法格式: 實例化對象::普通方法;
public static void main(String[] args) {Consumer<String> consumer = System.out::println;consumer.accept("java"); }//結果 java6. 構造引用
構造引用語法格式: 類名稱::new
-
和方法引用類似,函數式接口的抽象方法的形參列表和構造器的形參列表一致。
-
抽象方法的返回值類型即為構造器所屬的類的類型
實例:
public static void main(String[] args) {//原始寫法Supplier<Employee> sup = new Supplier<Employee>() {@Overridepublic Employee get() {return new Employee();}};// Lambda寫法Supplier<Employee> sup1 = () -> new Employee();//構造器引用寫法//Supplier中的T get()//Employee的空參構造器:Employee()Supplier<Employee> sup2 = Employee :: new;} // Lambda寫法 Function<Integer,Employee> func1 = id -> new Employee(id);//構造器引用寫法 //Function中的R apply(T t) Function<Integer,Employee> func2 = Employee :: new; // Lambda寫法 BiFunction<Integer,String,Employee> func1 = (id,name) -> new Employee(id,name);//構造器引用寫法 //BiFunction中的R apply(T t,U u) BiFunction<Integer,String,Employee> func2 = Employee :: new;7. 數組引用
數組引用的格式:type[]:new
public static void main(String[] args) {Function<Integer,String[]> function=String[]::new;String[] apply = function.apply(5);System.out.println(apply.length); }//結果 58. Lambda表達式的作用域
? Lambda表達式可以看作是匿名內部類實例化的對象,Lambda表達式對變量的訪問限制和匿名內部類一樣,因此Lambda表達式可以訪問局部變量、局部引用,靜態變量,實例變量。
8.1 訪問局部變量
可以直接在 lambda 表達式中訪問外部的局部變量
public static void main(String[] args) { final int num = 1; //不用聲明為final 也可以 //int num = 1; Converter<Integer, String> stringConverter =(from) -> String.valueOf(from + num);stringConverter.convert(2); }//結果 38.2 訪問對象字段,靜態變量
和局部變量不同的是,Lambda內部對于實例的字段(即:成員變量)以及靜態變量是既可讀又可寫。
import org.springframework.core.convert.converter.Converter;public static void main(String[] args) {Lambda4 lambda4 = new Lambda4();lambda4.testScopes(); }class LambdaTest {static int myStaticNum;int myNum;void testScopes() {Converter<Integer, String> stringConverter1 = (from) -> {outerNum = 23;return String.valueOf(from);};String convert = stringConverter1.convert(1);System.out.println("Integer轉化String結果" + convert);Converter<Integer, String> stringConverter2 = (from) -> {outerStaticNum = 72;return String.valueOf(from);};String convert2 = stringConverter2.convert(2);System.out.println("Integer轉化String結果" + convert2);} }//結果 Integer轉化String結果 1 Integer轉化String結果 29. 總結
? java8新特性之lambda表達式知識總結的文章就介紹到這了,這邊列舉了部分例子供參考,僅作為學習筆記使用,歡迎批評指正,要是感興趣可以關注微信訂閱號 程序own
總結
以上是生活随笔為你收集整理的java8中的lambda表达式实用详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python爬虫京东口红销售排行
- 下一篇: 从朋友圈看女神的情感状态