Lambda表達式


Lambda表達式

前言

本文章帶你全面的理解Lambda表達式以及使用,首先你需要了解利用行為參數化來傳遞代碼有助於應對不斷變化的需求。它允許你定一個代碼塊來表示一個行為,然後傳遞他。你可以決定在某一事件發生時(例如單擊一個按鈕)或在算法中的某一特定時刻(例如篩選算法中類似於“重量超過150克的蘋果”的謂詞,或者排序中的自定義比較操作)運行該代碼塊,利用這個概念,你就可以編寫更為靈活且可重複使用的代碼了。

Lambda管中窺豹

可以把Lambda表達式理解為簡潔地表示可傳遞的匿名函數的一種方式:它沒有名稱,但他有參數列表、函數主體、返回類型,可能還有一個可以拋出異常列表。這個定義夠大的,讓我們慢慢道來。

  • 匿名-我們說匿名,是因為他不像普通的方法那樣有一個明確的名稱:寫的少而且想的多
  • 函數-我們說他是匿名,是因為Lambda函數不像方法那樣屬於某個特定的類。但和方法一樣,他有參數列表、函數主體、返回類型,可能還有一個可以拋出異常列表。
  • 傳遞-Lambda表達式可以作為參數傳遞給方法或存儲在變量中。
  • 簡潔-無需像匿名類那樣寫很多模版代碼。

你是不是好奇Lambda這個詞是從哪裡來的?其實他是源於學術界開發出來的一套用來描述計算機的拉姆打演算法。你為什麼應該關心Lambda表達式呢?在Java中傳遞代碼十分繁瑣和冗長。那麼現在有了好消息!Lambda解決了這個問題:他可以讓你十分簡明的傳遞代碼。理論上來說,你在Java8之前做不到的事,Lambda也做不了。但是現在你用不著再用匿名類寫一堆笨重的代碼,來體驗行為參數化的好處了!Lambda表達式鼓勵你採用行為參數化的風格。最終讓代碼變得更為清晰,更靈活。比如,利用Lambda表達式,你可以更為簡潔的自定義一個Comparator對象。

<code>(Apple a1 , Apple a2)-> a1.getWeight().compareTo(a2.getWeight());/<code>

之前:

<code>Comparator<apple> byWeight = new Comparator<apple>(){public int compare(Apple a1 , Apple a2){  return a1.getWeight().compareTo(a2.getWeight());  }}/<apple>/<apple>/<code>

之後(用了Lambda表達式)

<code>Comparator<apple> byWeight = (Apple a1 , Apple a2) -> a1.getWeight().compareTo(a2.getWeight());/<apple>/<code>

不得不承認,代碼看起來更清晰了!要是現在你覺得Lambda表達式看起來一頭霧水的話也沒關係,我們很快會一點點解釋清楚的。現在,請注意你基本上只傳遞了比較兩個蘋果重量所真正需要的代碼。看起來就像是隻傳遞了Compare方法的主體。你很快就會學到,你甚至還可以進一步簡化代碼。我們將在下一節解釋在哪裡以及如何使用Lambda表達式。

我們剛剛展示的Lambda表達式有三個部分

  • 參數列表-這裡採用了Comparator中的Compare方法的參數,兩個Apple;
  • 箭頭-箭頭把參數與Lambda主體分隔開;
  • Lambda主體-比較兩個Apple的重量。表達式就是Lambda的返回值了。

為了進一步說明,下面給出了Java 8 中五個有效的Lambda表達式例子。

<code>(String s) -> s.length()(Apple a) -> a.getWeight() > 150(int x , int y) -> {System.out.println("Result:");System.out.println(x + y);}() -> 42(Apple a1 , Apple a2) -> a1.getWeight().compareTo(a2.getWeight())/<code>

Java語言設計者選擇這樣的語法,是因為C#和Scala等語言中的類似功能廣受歡迎,Lambda的基本語法是


<code>(parameters) -> expression(parameters) -> {statements}/<code>

你可以看到,Lambda表達式的語法很簡單。

下一章將介紹Lambda表達式的使用場景以及如何使用。


分享到:


相關文章: