摘要:的表達式什么是表達式簡單的說,表達式就是匿名方法。如下線程可以看到使用匿名內部類的話就省略了新建接口的實現類這一步驟。
Java的Lambda表達式 1. 什么是Lambda表達式
簡單的說,Lambda表達式就是匿名方法。Lambda表達式讓程序員能夠使用更加簡潔的代碼,但是同樣也使代碼的可讀性比較差。
Lambda表達式也叫做匿名方法或者閉包。
2. 和匿名內部類做對比Lambda是匿名方法,這個時候我們會想想到匿名內部類,我們來回想一下匿名內部類的用法,比如下面的代碼就是使用匿名內部類實現了一個線程。
public class Test { public static void main(String[] args) { Thread t = new Thread(new Runnable() { @Override public void run() { System.out.println("線程:" + Thread.currentThread().getName()); } }); t.start(); } }
我們一般的做法是寫一個Runnable接口的實現類,然后new一個實現類再傳給Thread的構造器。如下:
public class Test { public static void main(String[] args) { MyThread myThread = new MyThread(); Thread t = new Thread(myThread); t.start(); } static class MyThread implements Runnable { @Override public void run() { System.out.println("線程:" + Thread.currentThread().getName()); } } }
可以看到使用匿名內部類的話就省略了新建Runnable接口的實現類這一步驟。
3. 使用Lambda表達式上面使用匿名內部類的寫法,如果使用Lambda表達式可以寫成下面這樣:
public class Test { public static void main(String[] args) { Thread t = new Thread(() -> { System.out.println("線程:" + Thread.currentThread().getName()); }); t.start(); } }
這樣有一個問題,如果接口里面有多個方法,那么Lambda表達式怎么知道實現的是哪個方法呢?我們通過代碼測試一下:
package com.wangjun.othersOfJava; public class LambdaTest { public static void main(String[] args) { Animal a = () -> { // 編譯報錯:The target type of this expression must be a functional interface System.out.println("狗狗吃飯"); }; a.eat(); } interface Animal { public void eat(); public void duty(); } }
可以看到編譯報錯,這個提到一個functional interface,就是函數式接口。函數式接口就是只有一個抽象方法的接口。這樣,就不難理解了,原來Lambda表達式只支持函數式接口。
4. Lambda表達式使用的幾種方式package com.wangjun.othersOfJava; public class LambdaTest { public static void main(String[] args) { // 帶類型 Animal a1 = (String str) -> { System.out.println("狗狗吃飯:" + str); }; // 不帶類型 Animal a2 = (str) -> { System.out.println("狗狗吃飯:" + str); }; // 不帶括號 Animal a3 = str -> { System.out.println("狗狗吃飯:" + str); }; // 不帶大括號 Animal a4 = str -> System.out.println("狗狗吃飯:" + str); a1.eat("火腿腸"); a2.eat("牛肉"); a3.eat("面條"); a4.eat("米飯"); // 使用return返回 Person p1 = () -> { return "老師的職責:教書育人!"; }; // 直接返回 Person p2 = () -> "醫生的職責:救死扶傷!"; System.out.println(p1.duty()); System.out.println(p2.duty()); } // 沒有返回值 interface Animal { public void eat(String str); } // 有返回值 interface Person { public String duty(); } }5. Java的雙冒號表達式
JDK8中有雙冒號的用法,就是把方法當做參數傳到stream內部,使stream的每個元素都傳入到該方法里面執行一下。下面通過遍歷一個List來說明一下雙冒號和Lambda表達式使用方式的不同。
package com.wangjun.othersOfJava; import java.util.Arrays; import java.util.List; import java.util.function.Consumer; public class LambdaTest { public static void printStr(String str) { System.out.println(str); } public static void main(String[] args) { Listlist = Arrays.asList("aaa","bbb","ccc"); // 1.通常的遍歷方式 for(String str: list) { LambdaTest.printStr(str); } // 2.使用Lambda表達式遍歷 list.forEach(str -> { LambdaTest.printStr(str); }); // 3.使用::遍歷 list.forEach(LambdaTest::printStr); // 下面的方法和上面等價,使用的是函數式編程 Consumer methodParam = LambdaTest::printStr; //方法參數 list.forEach(x -> methodParam.accept(x));//方法執行accept } }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71233.html
摘要:在支持一類函數的語言中,表達式的類型將是函數。匿名函數的返回類型與該主體表達式一致如果表達式的主體包含一條以上語句,則表達式必須包含在花括號中形成代碼塊。注意,使用表達式的方法不止一種。 摘要:此篇文章主要介紹 Java8 Lambda 表達式產生的背景和用法,以及 Lambda 表達式與匿名類的不同等。本文系 OneAPM 工程師編譯整理。 Java 是一流的面向對象語言,除了部分簡...
摘要:表達式簡介表達式是一個匿名函數對于而言并不很準確,但這里我們不糾結這個問題。如果表達式的正文有一條以上的語句必須包含在大括號代碼塊中,且表達式的返回值類型要與匿名函數的返回類型相同。 版權聲明:本文由吳仙杰創作整理,轉載請注明出處:https://segmentfault.com/a/1190000009186509 1. 引言 在 Java 8 以前,若我們想要把某些功能傳遞給某些方...
摘要:初體驗下面進入本文的正題表達式。接下來展示表達式和其好基友的配合。吐槽一下方法引用表面上看起來方法引用和構造器引用進一步簡化了表達式的書寫,但是個人覺得這方面沒有的下劃線語法更加通用。 感謝同事【天錦】的投稿。投稿請聯系 tengfei@ifeve.com 本文主要記錄自己學習Java8的歷程,方便大家一起探討和自己的備忘。因為本人也是剛剛開始學習Java8,所以文中肯定有錯誤和理解偏...
摘要:語言是強類型面向對象的語言,所以必須提供一種數據類型作為表達式的返回值類型符合中函數格式的定義符合面向對象規則,所以最終表達式要有一個映射成對象的過程。定一個函數式接口我們在接口里定義了一個沒有參數返回值的抽象方法。 在JAVA中,Lambda 表達式(Lambda expression)是一個抽象方法的實現。這個抽象方法必須是在接口中聲明的,而且實現類只需要實現這一個抽象方法,我們稱...
摘要:表達式的主要作用就是代替匿名內部類的煩瑣語法。從這點來看,表達式的代碼塊與匿名內部類的方法體是相同的。與匿名內部類相似的是,由于表達式訪問了局部變量,該局部變量相當于與一個隱式的修飾,因此不允許對局部變量重新賦值。 函數式接口 函數式接口(Functional Interface)就是一個只有一個抽象方法(可以包含多個默認方法或多個static方法)的普通接口,可以被隱式轉換為lamb...
摘要:表達式又名閉包匿名函數筆記根據終于在中引入了表達式。函數式接口要介紹中表達式的實現,需要知道什么是函數式接口。但同樣需要保證外部的自由變量不能在表達式中被改變。 Java Lambda 表達式(又名閉包 (Closure)/ 匿名函數 ) 筆記 根據 JSR 335, Java 終于在 Java 8 中引入了 Lambda 表達式。也稱之為閉包或者匿名函數。 showImg(https...
閱讀 2337·2019-08-30 15:44
閱讀 1260·2019-08-30 13:01
閱讀 3307·2019-08-30 11:22
閱讀 3093·2019-08-29 15:23
閱讀 1614·2019-08-29 12:22
閱讀 3366·2019-08-26 13:58
閱讀 3439·2019-08-26 12:17
閱讀 3479·2019-08-26 12:16