1. 程式人生 > >Java8新特性:Lambda表示式和函式式介面

Java8新特性:Lambda表示式和函式式介面

Java8新特性:速度更快,程式碼更少,stream API,便於並行,最大化減少空指標異常:Optional

Lambda表示式

好處

Lambda是一個匿名函式,可以把lambda表示式理解為一段可以傳遞的程式碼,寫出更簡潔,更靈活的程式碼,使得Java語言表達能力得到提高

Lambda表示式只能為函式式介面的形參,變數賦值(SAM)
public class TestLambda1 {
	public static void main(String[] args) {
		//需要override run()方法
		new Thread(){
			public void run(){
				print();				
			}
		}.start();
		//用thread()啟動runnable()
		new Thread(new Runnable() {
			public void run() {
				print();
			}
		}).start();
		
		//匿名函式 lambda表示式,減少了程式碼量
		new Thread(() -> print()).start();
	}
	private static void print(){
		for(int i=0; i<=9; ++i){
			System.out.println(i);
		}
	}
}

函式式介面

具有SAM特性的介面(Single abstract method):

  1. 使得以這種型別的介面為引數時,可以使用Lambda表示式為引數,底層可以進行解析,不影響功能,減少程式碼量
  2. 函式式介面必定使用@FunctionalInterface進行修飾 註解: @FunctionalInterface SAM原則的兩個意外情況:
  • 抽象類的預設方法和靜態方法並不影響函式式介面的契約,可以隨意使用
  • 可以有Object重寫的方法,toString() hashcode(),equals()方法

Java四大核心函式式介面

名稱 函式式 引數型別 返回值 用途
消費型介面 Consumer< T > T void
供給型介面 Supplier< T >
斷定型介面 Predicate< T >
函式型介面 Function<T,R>

Lambda基本語法

在這裡插入圖片描述 格式:

  • 無參無返回值:
形式:() ->{Lambda 體}
說明: 如果Lambda體只有一句,那麼{ ;}可以省略
  • 無參有返回值:
()->{Lambda體}
說明:如果Lambda體只有一個語句,那麼{return;}可以省略
如果{}沒有省略,那麼return也不可以省略
()不可以省略
  • 有參無返回值:
消費型:
(形參列表)->{Lambda體} 
說明:如果Lambda體只有一個語句,那麼{;}可以省略
如果他的形參型別是確定的,或是可以推斷的,形參型別可以省略
如果形參列表只有一個,那麼形參和()都可以省略		

  • 有參有返回值:
(形參列表)->{Lambda體}
說明:如果Lambda體只有一個語句,{return ; }可以省略
如果形參的型別是確定的,或者是可以推斷的,那麼形參的型別可以省略
如果他的形參只有一個形參,那麼()和資料型別都可以省略
形參名不可以省略,但是形參名可以和介面的抽象方法的形參名不一樣
四大類核心的函式式介面:
1.消費型介面:
抽象方法有引數無返回值
Interface Consumer<T>:void accept(T t)
2.供給型:
抽象方法:有返回值無參
Interface Supplier<T>: T get()
3.功能性:
抽象方法:有參有返回值
Interface Function<T,R>
R apply<T t>
4.判斷型:
抽象方法:返回值是boolean
Interface Predicate<T>: boolean test(T t)
JDK1.8中的optional

背景 到目前為止,臭名昭著的空指標異常是導致Java應用程式失敗的最常見原因。以前,為了解決空指標異常,Google公司著名的Guava專案引入了Optional類,Guava通過使用檢查空值的方式來防止程式碼汙染,它鼓勵程式設計師寫更乾淨的程式碼。受到Google Guava的啟發,Optional類已經成為Java 8類庫的一部分。 Optional類是一個容器類,代表一個值存在還是不存在,原來用 null 表示一個值不存在,現在 Optional 可以更好的表達這個概念。並且可以避免空指標異常。

常用方法:
  • Optional.of(T t):建立一個optional物件例項,t不能為null
  • Optional.empty():建立一個空的optional例項物件