Java8 Lambda表達式詳解及實例
第一個Lambda表達式
在Lambda出現(xiàn)之前,如果我們需要寫一個多線程可能需要下面這種方式:
Runnable runnable = new Runnable() { @Override public void run() { System.out.println("Hello runnable"); } }; ... thread.start();
上面的例子如果改成使用Lambda就會簡單許多:
Runnable noArgs = ()->System.out.println("Hello Lambda!~"); ... thread.start();
Lambda表達式是一個匿名函數(shù),將行為像數(shù)據(jù)一樣傳遞,表達式使用 -> 將參數(shù)和主體分開, -> 前面是參數(shù)部分,后面這是主體部分。
Lambda的其它形式
BinaryOperator<Long> add = (x,y)->x+y; //OR BinaryOperator<Long> add = (Long x,Long y)->x+y; //OR BinaryOperator<Long> add = (Long x,Long y)->{ x+y; };
- Lambda表達式使用 () 表示沒有參數(shù)。
- 如果Lambda表達式中只包含一個參數(shù),可省略掉 () 。
- 如果Lambda表達式的主題是一段代碼塊,需要使用 {} ,該代碼塊與普通的Java代碼塊并無區(qū)別,也可以返回或拋出異常。
- 如果參數(shù)的類型可以由編譯器推斷得出可以省略參數(shù)類型,當然你也可以加上。
以上就是Lambda表達式的所有形式了。
那么問題來了:
BinaryOperator<Long> add = (Long x,Long y)->x+y; 是個什么意思?
這行代碼并不是講個數(shù)字相加,而是創(chuàng)建了一個函數(shù),用來計算兩個數(shù)字相加的結(jié)果。而add的類型是 BinaryOperator<Long> ,它也不是兩個數(shù)字的和,而是將兩個數(shù)字相加的那段代碼。下面的例子展示如何使用這個變量:
BinaryOperator<Long> add = (Long x,Long y)->x+y; Long res = add.apply(3L, 4L); System.out.println("res="+res);//輸出:res=7
函數(shù)接口
函數(shù)接口是只有一個抽象方法的接口,用作Lambda表達式的類型。
如 Runnable 就是一個函數(shù)接口。
新建一個我們自己的函數(shù)接口:
public interface AddOperator<T,D> { long add(T one,D two); }
使用:
AddOperator<Long,Long> addOperator = ( x, y)->x +y; System.err.println("Custom function listener res= "+addOperator.add(34L, 65L));
目標類型
目標類型是指Lambda表達式所在上下文環(huán)境的類型。比如,將Lambda表達式賦值給一個局部變量,或傳遞給一個方法作為參數(shù),局部變量或方法參數(shù)的類型就是Lambda表達式的目標類型。
final
如果我們在匿名內(nèi)部類中引用了所在方法中的局部變量,這是需要局部變量是 final 的。
在Lambda中我們不需要將引用的外部局部變量聲明為 final 的,但是該變量只能被賦值一次。
下面的例子中如果我們?nèi)サ糇⑨?,對name再次賦值,則無法通過編譯,并顯示出錯信息: local variables referenced from a Lambda expression must be final or effectively final.
Lambda表達式引用的局部變量必須是final或即成事實的final。
String name = getUserName(); //name="hi"; button.addActionListener(event->System.out.println("name="+name));
類型推斷
Lambda表達式的類型推斷是Java7中就引入的目標類型推斷的擴展。
java7中的類型推斷:
List<String> list= new ArrayList<>();
上例中我們并沒有指定ArrayList的范型類型,而是根據(jù)list的類型,推斷出了ArrayList的范性類型。
如: AddOperator<Long,Long> addOperator = ( x, y)->x +y;
通過此文,希望能幫助到大家,學習理解,此部分知識,謝謝大家對本站的支持!
相關文章
IDEA?+?Maven環(huán)境下的SSM框架整合及搭建過程
這篇文章主要介紹了IDEA?+?Maven環(huán)境下的SSM框架整合及搭建過程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01Java避免UTF-8的csv文件打開中文出現(xiàn)亂碼的方法
這篇文章主要介紹了Java避免UTF-8的csv文件打開中文出現(xiàn)亂碼的方法,結(jié)合實例形式分析了java操作csv文件時使用utf-16le編碼與utf8編碼相關操作技巧,需要的朋友可以參考下2019-07-07記一次集成swagger2(Knife4j)在線文檔提示:Knude4j文檔請求異常的解決辦法
Knife4j是一個集Swagger2 和 OpenAPI3為一體的增強解決方案,下面這篇文章主要給大家介紹了關于一次集成swagger2(Knife4j)在線文檔提示:Knude4j文檔請求異常的解決辦法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2024-02-02Java中IO流 RandomAccessFile類實例詳解
這篇文章主要介紹了Java中IO流 RandomAccessFile類實例詳解的相關資料,需要的朋友可以參考下2017-05-05基于java.lang.IllegalArgumentException異常報錯問題及解決
這篇文章主要介紹了基于java.lang.IllegalArgumentException異常報錯問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03Java解析照片拿到GPS位置數(shù)據(jù)的詳細步驟
這篇文章主要介紹了Java解析照片拿到GPS位置數(shù)據(jù),本文給大家介紹代碼環(huán)境及核心代碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03