天天看點

Java8函數式程式設計之二 : Lambda表達式

針對上篇部落格最後留下的問題,也就是java8怎樣解決匿名内部類代碼難看,臃腫的的問題,我們先來看一下解決方法,使用Lambda表達式:

//使用匿名内部類

List tradeInAmerica =filterTrade(trades,newTradePredicate() {

@Override

public booleantest(Trade trade) {

return"America".equals(trade.getCountry());

}

});

//使用Lambda表達式

List list =filterTrade(trades,(Trade trade) ->"America".equals(trade.getCountry()));
           

——————————————————————————

有沒有覺得很神奇,隻要一行代碼就可以代替上面 那麼多行代碼。即使現在你覺得疑惑也沒有關系,我們先看一個Wiki對Lambda的定義:

lambda expression in computer programming, also calledanonymous function, a function (or a subroutine) defined, and possibly called, without being bound to an identifier
           

相信你看懂了幾個重要的單詞:操作符,匿名函數。

Lambda表達式可以了解為一種匿名函數:它沒有名稱,但是有參數清單,函數主體,傳回類型。

Java Lambda表達式是一種匿名函數;它是沒有聲明的方法,即沒有通路修飾符,傳回值聲明和名字。

————————

Lambda表達式的作用:

1.傳遞行為,而不僅僅是值

2.提升抽象層次

3.API重用性更好

4.更加靈活

————

像(Trade trade) ->”America”.equals(trade.getCountry()) 一樣,Lambda分為三部分:

1.參數清單 - 比如trade就是一個參數清單

2.箭頭操作符 - 把參數清單與Lanbda主體分隔開

3.Lambda主體 -“America”.equals(trade.getCountry()

——————————————————

1.一個Lambda表達式可以有0個或者多個參數;

2.參數的類型既可以明确聲明,也可以根據上下文來推斷。比如:(int a) 與(a) 效果相同。

3.所有參數需要包含在圓括号内,參數之間用逗号隔開。比如: (a,b) 或者 (int a, int b)或者 (String a, int b, float c)

4.空圓括号代表參數集為空。比如: () -> 42

5.當隻有一個參數,并且類型可以推導時,圓括号()可以省略。比如: a -> return a * a

6.Lambda表達式的主體可以包含0條或者多條語句

7.如果Lambda表達式的主體隻有一條語句,花括号{}可以省略。匿名函數的傳回類型與該主體表達式一緻。

8.如果Lambda表達式的主體包含一條以上語句,則表達式必須包含在花括号中。

——————

Lambda表達式的文法格式是:

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

Lambda表達式的使用執行個體:

布爾表達式 : (List list) -> list.isEmpty()

建立對象 : () -> new Apple(10)

消費一個對象:(Trade trade) -> {System.out.println(trade.getMoney())}

從一個對象中選擇:(String s) -> s.length()

組合兩個值 : (int a, int b) -> a * b

比較兩個對象 : (Trade trade1,Trade trade2) -> trade1.getMoney().compareTo(trade2.getMoney())

————————————————————

好了,這就是Lambda表達式的介紹,如果你還是不熟悉,不用擔心,後面我們會大量的使用Lambda表達式,熟能生巧!

你是否有疑問,Lambda表達式在哪裡使用呢以及如何使用呢?

答案是在函數式接口上使用Lambda表達式。哈哈,你肯定還會繼續問:什麼是函數式接口呢?

要了解這個問題,請看下一篇部落格 。