java8之新特性Lambda表達式--匿名內部類


什么是Lambda表達式:簡單來說,可以看成是對匿名內部類的縮寫,使用Lambda表達式,接口必須是函數式接口。

Lambda 表達式作用:使用 Lambda 表達式可以使代碼變的更加簡潔緊湊

Lambda 表達式,也可稱為閉包,它是推動 Java 8 發布的最重要新特性

語法

lambda 表達式的語法格式如下:

(parameters) -> expression 或 (parameters) ->{ statements}

以下是lambda表達式的重要特征:

  • 可選類型聲明:不需要聲明參數類型,編譯器可以統一識別參數值。
  • 可選的參數圓括號:一個參數無需定義圓括號,但多個參數需要定義圓括號。
  • 可選的大括號:如果主體包含了一個語句,就不需要使用大括號。
  • 可選的返回關鍵字:如果主體只有一個表達式返回值則編譯器會自動返回值,大括號需要指定明表達式返回了一個數值。

Lambda 表達式實例

Lambda 表達式的簡單例子:

// 1. 不需要參數,返回值為 5   () -> 5 // 2. 接收一個參數(數字類型),返回其2倍的值  x -> 2 * x // 3. 接受2個參數(數字),並返回他們的差值  (x, y) -> x  y // 4. 接收2個int型整數,返回他們的和  (int x, int y) -> x + y // 5. 接受一個 string 對象,並在控制台打印,不返回任何值(看起來像是返回void)  (String s) -> System.out.print(s)
==================================================
下面我們一起了解下什么叫做匿名內部類:
讓我們看看內部類跟匿名內部類概念與格式:
概述:什么是內部類的定義

將一個類A定義在另一個類B里面,里面的那個類A就被稱為內部類,B則稱為外部類

成員內部類:是定義在類中方法之外的類

定義格式如下所示:

class 外部類 {
       class 內部類 {
        }  
}

  下面編寫一個包含內部的Person類:

package com.test.cgb;

public class Person {
	private boolean live = true;
	
	class Heart {
		public void jump() {
			// 直接訪問外部類成員
			if (live) {
				System.out.println("心臟在跳動");
			} else {
				System.out.println("心臟不跳了");
			}
		}
	}
	
	public boolean isLive() {
		return live;
	}
	
	public void setLive(boolean live) {
		this.live = live;
	}
}

  測試類如:

package com.test.cgb;

import com.test.cgb.Person.Heart;

public class InnerDemoTest {
	public static void main(String[] args) {
		// 創建外部類對象
		Person p = new Person();
		// 創建內部類對象,也就是外部類要訪問內部類的成員
		Heart heart = p.new Heart();
		
		// 調用內部類方法
		heart.jump();
		
		// 調用外部類方法
		p.setLive(false);
		
		// 調用內部類方法
		heart.jump();
		
		
	}
}
輸出結果為:
心臟在跳動
心臟不跳了

  Person類經過編譯之后,源文件生成兩個字節碼文件,其中內部類仍然是一個獨立的類,在編譯之后的內部類會被編譯成獨立的.class文件,但是前面是被加上外部類的類名和$符號;比如:Person$Heart.class是分別為:

 

 

接下來我們再看看匿名內部類:
匿名內部類:是內部類的簡化寫法,它的本質是一個帶具體實現的,父類或者父接口的,匿名的,子類對象。
在開發的過程中,最常用到的就是匿名內部類了
前提:匿名內部類必須是繼承一個父類或者實現一個父接口。
,這里的類可以是具體類也可以是抽象類,本質就是一個繼承了該類或者實現了該接口的子類匿名對象。
格式如下所示:
new 父類名或者接口名() {
       // 方法重寫
      @Override
      public void method() { 
         // 執行語句
     }
}
 
        

  以接口為例,匿名內部類的使用,代碼如下

定義CryptonymInnerInterface接口:

package com.test.cgb;

public interface CryptonymInnerInterface {
	// 定義一個抽象方法sum
	public int sum(int numberOne, int numberTwo);
}

  編寫測試類:

package com.test.cgb;

public class CryptonymInnerTest {

	public static void main(String[] args) {
		/**
		 * 編寫實現類的方式如 :
		 * public class CryptonymInnerImpl implements CryptonymInnerInterface{
					@Override
					public int sum(int numberOne, int numberTwo) {
						return numberOne + numberTwo;
					}
			}
		 */
//		CryptonymInnerInterface m1 = new CryptonymInnerImpl();
//		int sumNumber = m1.sum(123, 456);
//		System.out.println(sumNumber);
		
		/*
		 * 匿名內部類的方式:因為平時是把類看成是一個模板,為了復用性才會把類寫在一個java文件里;
		 * 但是這里我們不需要重復使用該類,所以可以不用編寫類文件,而是使用匿名內部類的方式。
		 */ 
		CryptonymInnerInterface m1 = new CryptonymInnerInterface() {
			@Override
			public int sum(int numberOne, int numberTwo) {
				return numberOne + numberTwo;
			}
		};
		System.out.println(m1.sum(123,456));
	}
}

  

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM