本章主要講述的是從jd1.8之後的新特性–lambda表示式的簡化和使用方法引用進一步簡化lambda表示式。
lambda表示式也可稱為閉包,允許把函式作為乙個方法的引數(函式作為引數傳遞進方法中),其核心目的就是為了簡化匿名內部類的**寫法,簡化函式式介面。
學習使用lambda表示式,看到別人的** \ 。。/
一、lambda表示式格式:
(匿名內部類被重寫方法的形參列表) ->
-> 就是乙個新語法,沒有實際含義,但是不能省略!
二、 lambda表示式使用前提
(1)lambda表示式並不能簡化所有匿名內部類的寫法。
(2)lambda表示式只能簡化介面中只有乙個抽象方法的匿名內部類形式。
(3) lambda表示式只能簡化"函式式介面"的匿名內部類寫法:
a.首先必須是介面。
b.介面中只能有乙個抽象方法。
那麼如何才能確定這個介面可以使用lambda表示式簡化以及如何去將匿名內部類簡化?
三、 具體例子
(1)在原始碼中發現有@functionalinte***ce函式式介面註解,一旦某個介面加上了這個註解,這個介面只能有且僅有乙個抽象方法。這個介面就可以被lambda表示式簡化,如下面runnable介面的匿名內部類的簡化過程
//初始形態
newthread
(new
runnable()
};})
.star()
; ↓↓
//上下文推斷
newthread((
)->).
start()
; ↓↓
//最後的lambda表示式
newthread((
)->
system
.out.
println
(thread
.currentthread()
.getname()
)).start()
;}
lambda簡化comparator介面匿名內部類寫法
collections
.sort
(stus,
newcomparator
<
student
>()
});collections
.sort
(stus,
(student o1,
student o2)
->);
collections
.sort
(stus,
(student o1,
student o2)
-> o2.
getcolor()
- o1.
getcolor()
);collections
.sort
(stus,
( o1, o2)
-> o2.
getcolor()
- o1.
getcolor()
);
從runnable和comparator兩個介面的lamda簡化寫法的過程來看
(1)如果lambda表示式的方法體**只有一行**。可以省略大括號不寫,同時要省略分號!
(2)如果lambda表示式的方法體**只有一行**。可以省略大括號不寫。
此時,如果這行**是return語句,必須省略return不寫,同時也必須省略";"不寫
(3)引數型別可以省略不寫。
(4)如果只有乙個引數,引數型別可以省略,同時()也可以省略。
四、進一步簡化lambda表示式
方法引用:
1.靜態方法的引用。
引用格式:
類名::靜態方法。
簡化步驟:
a.定義乙個靜態方法,把需要簡化的**放到乙個靜態方法中去。
靜態方法引用的注意事項:被引用的方法的引數列表要和函式式介面中的抽象方法的引數列表一致。
比如上面的comparator介面lambda表示式最後為
collections
.sort
(stus,
( o1, o2)
-> o2.
getcolor()
- o1.
getcolor()
);
通過靜態方法引用我們可以寫成下面的形式
collections
.sort
(lists,
student
::comparebyage
);
其中student為類名,comparebyage為靜態方法,是寫在student類中
public
static
intcomparebyage
(student o1 ,
student o2)
2.例項方法的引用。
格式: 物件::例項方法。
簡化步驟:
a.定義乙個例項方法,把需要的**放到例項方法中去。
比如
lists.
foreach
(s ->
system
.out.
println
(s))
;
可以寫成
lists.
foreach
(system
.out::
println
);
3.特定型別方法的引用。
特定型別:string ,任何型別。
格式:特定型別::方法。
注意: 如果第乙個引數列表中的形參中的第乙個引數作為了後面的方法的呼叫者,並且其餘引數作為後面方法的形參,那麼就可以用特定型別方法引用了。
比如下面的忽略大小寫比較,其中o1,o2是為string型別的引數
arrays
.sort
(strs,
( o1, o2)
-> o1.
comparetoignorecase
(o2)
);
就可以簡化為
arrays
.sort
(strs,
string
::comparetoignorecase
);
4.構造器引用。
格式是:類名::new。
注意點:前後引數一致的情況下,又在建立物件就可以使用構造器引用
比如:
string
arrs = lists.
toarray
(new
intfunction
<
string
>()
});string
arrs2 = lists.
toarray
(value ->
newstring
[value]
);
通過特定型別方法的引用進一步簡化為
string
arrs2 = lists.
toarray
(string
::new
);
lambda表示式 lambda表示式
1.概述 c 11 中的 lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda 的語法形式如下 函式物件引數 操作符過載函式引數 mutable 或 exception 宣告 返回值型別可以看到,lambda 主要分為五個部分 函式物件引數 操作符過載函式引數 muta...
lambda表示式學習
lambda表示式的基本形式,如下 capture list params list key word mutuble return type說明 1 capture list 裡面的內容具體形式如下 2 params list 輸入引數,這個和普通的函式一樣 3 keyword mutuble 預...
Lambda表示式學習
看完肯定會有幫助 理解functional inte ce 函式式介面 是學習lambda表示式的關鍵 函式式介面的定義 任何介面,如果只包含唯一乙個抽象方法,那麼它就是乙個函式式介面。對於函式式介面,可以通過lambda表示式來建立該介面的物件 演化過程 一般我們定義介面 例項化介面方法,程式呼叫...