最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡單易懂的java8新特性之lambda表達式知識總結(jié)

 更新時間:2021年05月24日 14:44:34   作者:TS六道輪回  
一直想針對lambda表達式作一個總結(jié),借助于這次公司安排的考試作一個入門式的總結(jié),對正在學(xué)習(xí)java的小伙伴們非常有幫助,需要的朋友可以參考下

一、概念

從本質(zhì)上來說,它就是一個匿名函數(shù),可以用來直接實現(xiàn)接口中的方法,從而簡化代碼。但是Lambda有一個限制,不能實現(xiàn)接口中的所有方法,所以Lambda表達式只能用于有且僅有一個必須需要實現(xiàn)的方法接口,這里需要注意必須需要實現(xiàn)這六個字。

public interface Printer {
//有一個需要實現(xiàn)的方法,可以使用Lambda表達式
	void print();
}
public interface Printer {
//有一個需要實現(xiàn)的方法,可以使用Lambda表達式
	void print();
	//這里雖然有一個方法,但接口提供了默認實現(xiàn),因此不是必須要實現(xiàn)的
	default void printDetail(){}
}
public interface Printer {
//有一個需要實現(xiàn)的方法,可以使用Lambda表達式
	void print();
//這里雖然有一個需要實現(xiàn)的方法,但不是必須要實現(xiàn)的,因為toString()是Object類中的.
String toString();	
}
public interface Printer {
//有一個需要實現(xiàn)的方法,可以使用Lambda表達式
	void print();
//這里雖然有一個需要實現(xiàn)的方法,但不是必須要實現(xiàn)的,因為toString()是Object類中的.
String toString();	
}

像這種只有一個必須要實現(xiàn)的方法的接口,在java8中稱之為函數(shù)式接口,在定義接口時可以在接口名上方加上@FunctionInterface標簽,用于驗證此接口是否為函數(shù)式接口。如果這個接口定義好之后不是函數(shù)式接口,那么接口名處會報錯。
在使用Lambda表達式的時候,不需要關(guān)注方法名,只需要關(guān)注方法參數(shù)和返回值即可。基本語法很簡單:

(參數(shù)列表)->{
	方法體
};

二、用法比較

java中實現(xiàn)接口的方式在java8之前有兩種:定義接口的實現(xiàn)類,使用匿名類,但Lambda表達式相比于這種方法都簡單很多。以上文的Printer接口為例,實現(xiàn)如下:

2.1 實現(xiàn)類

class PrinterImpl implements Printer{

	@Override
	public void print() {
		System.out.println("Hello World");
	}
	
}

2.2 匿名類

class PrinterAnonymous {

	Printer printer = new Printer() {
		
		@Override
		public void print() {
			System.out.println("Hello World");
			
		}
	};
	
}

2.3 Lambda

class PrinterLambda{
	Printer p = ()-> System.out.println("Hello World");
}

比較上文三種實現(xiàn)方式,很顯示Lambda的實現(xiàn)比前兩種簡單很多。

三、基本用法

3.1 無參數(shù)無返回值接口方法

@FunctionalInterface
public interface Printer {
	void print();
}
public class Tester {
	public static void main(String[] args) {
		// 方法一,無返回值的情況,方法體只有一條語句,可以省略大括號
		Printer p1 = () -> System.out.println("Hello World 1");
		p1.print();
		// 方法二,標準定義
		Printer p2 = () -> {
			System.out.println("Hello World 2");
		};
		p2.print();
	}
}

3.2 一個參數(shù)無返回值接口方法

@FunctionalInterface
public interface Printer {
	void print(String str);
}

public class Tester {

	public static void main(String[] args) {
		// 方法一,無返回值的情況,方法體只有一條語句,可以省略大括號
		//因為這里只有一個參數(shù),小括號也可以省略,小括號省略的前提是:有且僅有一個參數(shù)
		//Printer p1 = s -> System.out.println(s);
		Printer p1 = (s) -> System.out.println(s);
		p1.print("Hello World 1");
		// 方法二,無返回值的情況,方法體只有一條語句,可以省略大括號
		Printer p2 = (String s) -> System.out.println(s);
		p2.print("Hello World 2");
		// 方法三,標準定義
		Printer p3 = (String s) -> {
			System.out.println(s);
		};
		p3.print("Hello World 3");
	}
}

3.3 多個參數(shù)無返回值接口方法

@FunctionalInterface
public interface Printer {
	void print(String str1,String str2);
}

public class Tester {

	public static void main(String[] args) {
		// 方法一,無返回值的情況,方法體只有一條語句,可以省略大括號
		//參
		Printer p1 = (s1,s2) -> System.out.println(s1+" "+s2);
		p1.print("Hello World 1","Java 1");
		// 方法二,無返回值的情況,方法體只有一條語句,可以省略大括號
		Printer p2 = (String s1,String s2) -> System.out.println(s1+" "+s2);
		p2.print("Hello World 2","Java 2");
		// 方法三,標準定義
		Printer p3 = (String s1,String s2) -> {
			System.out.println(s1+" "+s2);
		};
		p3.print("Hello World 3","Java 3");

	}

}

3.4 無參數(shù)有返回值接口方法

@FunctionalInterface
public interface Printer {
	boolean print();
}


public class Tester {

	public static void main(String[] args) {
		// 方法一,有返回值的情況,只有一條語句,return關(guān)鍵字的有無決定能否活力大括號
		Printer p1 = () ->  true;
		boolean has1 = p1.print();
		System.out.println(has1);//測試返回結(jié)果
		// 方法二,標準定義
		Printer p2 = () -> {return true;};
		boolean has2 = p2.print();
		System.out.println(has2);//測試返回結(jié)果
		
	}
}

3.5 一個參數(shù)有返回值接口方法

@FunctionalInterface
public interface Printer {
	boolean print(boolean good);
}
public class Tester {

	public static void main(String[] args) {
		// 方法一,有返回值的情況,只有一條語句,return關(guān)鍵字的有無決定能否活力大括號
	   //因為這里只有一個參數(shù),小括號也可以省略,小括號省略的前提是:有且僅有一個參數(shù)
	   //Printer p1 = good ->  good;
		Printer p1 = (good) ->  good;
		boolean has1 = p1.print(true);
		System.out.println(has1);
		// 方法二,標準定義
		Printer p2 = (good) -> {return good;};
		boolean has2 = p2.print(false);
		System.out.println(has2);
		
	}
}

3.6 多個參數(shù)有返回值接口方法

@FunctionalInterface
public interface Printer {
	boolean print(boolean good1,boolean good2);
}

public class Tester {

	public static void main(String[] args) {
		// 方法一,有返回值的情況,只有一條語句,return關(guān)鍵字的有無決定能否活力大括號
		Printer p1 = (good1,good2) ->  good1;
		boolean has1 = p1.print(true,false);
		System.out.println(has1);
		// 方法二,標準定義
		Printer p2 = (good1,good2) -> {return good1;};
		boolean has2 = p2.print(false,false);
		System.out.println(has2);
		
	}
}

四、函數(shù)引用

在實現(xiàn)一個接口的方法時,如果現(xiàn)有的其他地方的某個函數(shù)已經(jīng)實現(xiàn)了接口方法的邏輯,可以使用方法引用直接將這個邏輯引用過來。

4.1 靜態(tài)方法引用

語法:

接口名 變量名 = 類 ::已實現(xiàn)的方法

注意事項:

  • 在引用的方法后面,不要添加小括號
  • 引用的這個方法,參數(shù)和返回值,必須要跟接口中定義的一致

示例:
Printer 需要實現(xiàn)的方法在Checker中有同樣的實現(xiàn),這樣就可以直接引用過來

@FunctionalInterface
public interface Printer {
	String print(boolean good1,boolean good2);
}

public class Checker {
	public static String check(boolean a,boolean b) {
		if(a && b) {
			return "Java is good";
		}else if (!a && b) {
			return "Java is better";
		}
		return "Java is best";
	}
}
public class Tester {

	public static void main(String[] args) {
		Printer p1 = Checker::check;//用類名來引用
		System.out.println(p1.print(true, true));
		
	}
}

4.2 非靜態(tài)方法引用

語法:

接口名 變量名 = 對象 ::靜態(tài)方法

注意事項:

  • 在引用的方法后面,不要添加小括號
  • 引用的這個方法,參數(shù)和返回值,必須要跟接口中定義的一致

示例:
Printer 需要實現(xiàn)的方法在Checker中有同樣的實現(xiàn),這樣就可以直接引用過來

@FunctionalInterface
public interface Printer {
	String print(boolean good1,boolean good2);
}

public class Checker {
	public String check(boolean a,boolean b) {
		if(a && b) {
			return "Java is good";
		}else if (!a && b) {
			return "Java is better";
		}
		return "Java is best";
	}
}
public class Tester {

	public static void main(String[] args) {
		Printer p1 = new Checker()::check;//必須用對象來引用
		System.out.println(p1.print(true, true));
		
	}
}

4.3 構(gòu)造方法的引用

如果一個函數(shù)式接口中定義的方法僅僅是為了得到一個對象,此時我們就可以使用構(gòu)造方法的引用,簡化這個方法的實現(xiàn)
語法:

接口名 變量名 = 類名 ::new

注意事項:
可以通過接口中的方法參數(shù),區(qū)分引用不同的構(gòu)造方法
示例:

@FunctionalInterface
public interface Printer1 {
	Checker getCheck();
}

@FunctionalInterface
public interface Printer2 {
	Checker getCheck(int a);
}

public class Checker {
	int times;
	public Checker() {
		System.out.println("I am none parameter");
	}
	
	public Checker(int a) {
		System.out.println("I have one parameter");
	}
}

public class Tester {

	public static void main(String[] args) {
		//引用無參構(gòu)造方法
		Printer1 p1 = Checker::new;
		p1.getCheck();
		//引用有參構(gòu)造方法
		Printer2 p2 = Checker::new;
		p2.getCheck(1);
		
	}
}

4.4 對象方法的特殊引用

如果實現(xiàn)某些接口的時候,Lambda表達式中包含了某一個對象,此時方法體中,直接使用這個對象調(diào)用它的某一個方法就可以完成整個的邏輯。其他的參數(shù),可以作為調(diào)用方法的參數(shù)。此時,可以對這種實現(xiàn)進行簡化。
示例:

@FunctionalInterface
public interface Printer1 {
	int getCheck(Checker checker);
}

@FunctionalInterface
public interface Printer2 {
	void setCheck(Checker checker, int a);
}

public class Tester {

	public static void main(String[] args) {
		Checker checker = new Checker();
		checker.setTimes(100);
		// 沒有簡化前,按照之前的方法使用lambda表達式
		Printer1 p1 = x -> x.getTimes();
		System.out.println(p1.getCheck(checker));//測試

		// 簡化之后
		Printer1 p11 = Checker::getTimes;
		System.out.println(p11.getCheck(checker));//測試
		
		// 沒有簡化前,按照之前的方法使用lambda表達式
		Printer2 p2 = (x,y)-> x.setTimes(y);
		p2.setCheck(checker, 50);
		System.out.println(checker.getTimes());//測試
		// 簡化之后
		Printer2 p22 = Checker::setTimes;
		p22.setCheck(checker, 30);
		System.out.println(checker.getTimes());//測試

	}
}

五、注意

當在Lambda表達式中使用了某一個局部變量,那么這個局部變量的值在Lambda表達式之外,不可以被改變,因為默認將其定義成final常量。但全局變量變量沒有這方面的限制。
示例:

@FunctionalInterface
public interface Printer {
	void setTime();
}
public class Tester {

	public static void main(String[] args) {
		int time = 10;
		Printer p = () -> System.out.println(time);//這里出錯了,因為下一行對time進行修改
		time = 15;//這里的值不能改變,會導(dǎo)致上一行出錯

	}
}

基本概括了Lambda表達式的所有用法,不足之處,請諒解,謝謝!

到此這篇關(guān)于簡單易懂的java8新特性之lambda表達式知識總結(jié)的文章就介紹到這了,更多相關(guān)java lambda表達式內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺談Springboot實現(xiàn)攔截器的兩種方式

    淺談Springboot實現(xiàn)攔截器的兩種方式

    本文詳細的介紹了Springboot攔截器的兩種方式實現(xiàn),一種就是用攔截器,一種就是過濾器,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 基數(shù)排序簡介及Java語言實現(xiàn)

    基數(shù)排序簡介及Java語言實現(xiàn)

    這篇文章主要介紹了基數(shù)排序簡介及Java語言實現(xiàn),涉及基數(shù)排序的基本思想簡單介紹和桶排序的分析,以及基數(shù)排序的Java實現(xiàn),具有一定借鑒價值,需要的朋友可以參考下。
    2017-11-11
  • java實現(xiàn)系統(tǒng)捕獲異常發(fā)送郵件案例

    java實現(xiàn)系統(tǒng)捕獲異常發(fā)送郵件案例

    這篇文章主要為大家詳細介紹了java實現(xiàn)系統(tǒng)捕獲異常發(fā)送郵件案例,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • 三種Java求最大值的方法

    三種Java求最大值的方法

    本篇文章給大家總結(jié)了在JAVA中求最大值的三種常用方法,以及代碼做了分享,需要的朋友參考下。
    2018-02-02
  • 解決Java中基于GeoTools的Shapefile讀取亂碼的問題

    解決Java中基于GeoTools的Shapefile讀取亂碼的問題

    本文主要討論了在使用Java編程語言進行地理信息數(shù)據(jù)解析時遇到的Shapefile屬性信息亂碼問題,以及根據(jù)不同的編碼設(shè)置進行屬性信息解析的方法,感興趣的朋友跟隨小編一起看看吧
    2025-03-03
  • 淺析Java ClassName.this中類名.this關(guān)鍵字的理解

    淺析Java ClassName.this中類名.this關(guān)鍵字的理解

    Java ClassName.this中類名.this關(guān)鍵字 的理解大家都了解多少,有不太了解的朋友可以參考下本文一起學(xué)習(xí)學(xué)習(xí)
    2016-05-05
  • Springboot中整合knife4j接口文檔的過程詳解

    Springboot中整合knife4j接口文檔的過程詳解

    knife4j就swagger的升級版API文檔的一個框架,但是用起來比swagger方便多了,UI更加豐富,這篇文章主要介紹了Springboot中整合knife4j接口文檔,需要的朋友可以參考下
    2022-04-04
  • Java面試必備之ArrayList陷阱解析

    Java面試必備之ArrayList陷阱解析

    昨天小楓接到了一個公司的面試電話,其中一道面試題覺得有點意思,在這里和大家一起分享下。面試題是ArrayList如何刪除指定元素。乍聽很簡單的問題,但是如果沒有實際踩過坑很容易掉進面試官的陷阱中,我們一起來分析下吧
    2022-02-02
  • visual studio 2019安裝配置可編寫c/c++語言的IDE環(huán)境

    visual studio 2019安裝配置可編寫c/c++語言的IDE環(huán)境

    這篇文章主要介紹了visual studio 2019安裝配置可編寫c/c++語言的IDE環(huán)境,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • JAVA使用POI獲取Excel的列數(shù)與行數(shù)

    JAVA使用POI獲取Excel的列數(shù)與行數(shù)

    Apache POI 是用Java編寫的免費開源的跨平臺的 Java API,Apache POI提供API給Java程式對Microsoft Office格式檔案讀和寫的功能。 下面這篇文章給大家介紹了JAVA使用POI獲取Excel列數(shù)和行數(shù)的方法,有需要的朋友們可以參考借鑒,下面來一起看看吧。
    2016-12-12

最新評論

乳源| 虎林市| 西和县| 张家界市| 武夷山市| 讷河市| 中阳县| 麻阳| 平塘县| 崇信县| 巴楚县| 和硕县| 象州县| 常德市| 阳春市| 杨浦区| 金昌市| 日照市| 平谷区| 梓潼县| 松江区| 天全县| 宁津县| 苗栗市| 定南县| 体育| 莒南县| 肃北| 邹城市| 油尖旺区| 台南县| 吉林市| 黎城县| 乌鲁木齐县| 东兴市| 托克托县| 洞口县| 临安市| 合水县| 敦化市| 英山县|