Java8新特性:Lambda表示式和函式式介面
阿新 • • 發佈:2018-12-19
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):
- 使得以這種型別的介面為引數時,可以使用Lambda表示式為引數,底層可以進行解析,不影響功能,減少程式碼量
- 函式式介面必定使用@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例項物件