2015-11-03 444 views
7
Interface AccountService{ 
    public void createAccount(); 
} 

AccountService accountServiceAnonymous = new AccountService(){ 
    public void createAccount(){ 
     Account account = new Account(); 
     save(account); 
    } 
}; 

AccountService accountServiceLambda =() -> { 
    Account account = new Account(); 
    save(account); 
} 

除了減少了代碼行數量外,在java 8中使用lambda表達式還有其他什麼好處嗎?在java 8中使用lambda表達式的優點是什麼?

+3

cise代碼,更多的可讀性,更少的儀式來做簡單的事情,即更換匿名類(你仍然必須編寫一個匿名類,在lambda的情況下,你不必寫一個類)。重用代碼,創建lambda表達式並將其傳遞給方法。進一步介紹lambda啓用了許多API,例如Stream,它提供了對迭代的抽象。 –

+1

爲了使用lambda以及爲什麼介紹它,請閱讀本書:Richard Warburton的Java 8 Lambdas –

+1

簡而言之:更少的樣板代碼=更多的可維護性。 –

回答

11

添加到@Bilbo在評論中提到的內容。在Java 1.7中,有一個新的JVM操作碼被髮布,命名爲invokedynamic,Java 8 Lambda使用它。所以下面的代碼會導致在編譯代碼時創建一個匿名類。可能的<ClassName>$1.class所以如果你有10個匿名類,它們是最後一個jar中的10個類。

AccountService accountServiceAnonymous = new AccountService(){ 
    public void createAccount(){ 
     Account account = new Account(); 
     save(account); 
    } 
}; 

但Java 8拉姆達使用invokedynamic調用lambda表達式因此,如果你有10個lambda表達式也不會造成任何由此匿名類減少最終罐子大小。

AccountService accountServiceLambda =() -> { 
    Account account = new Account(); 
    save(account); 
} 
+1

我記得[Venkat Subramaniam](https://www.linkedin.com/in/vsubramaniam)在他的一次會議上談到這件事。在那段視頻中,他還告訴上述功能不僅對Java有好處,而且對於諸如Scala等jvm類型語言也很有幫助,非常感謝您指出! – harshavmb

2

lambda表達式(和方法引用)的另一個優點是可見的,當你與流API和Java中8增加了其他功能,例如將它們組合可選的。

考慮以下代碼:

private void pushToFront(AbstractInfo contactInfo) { 
     registeredWindows.stream() 
      .filter(window -> window.getWindowId() == contactInfo.getId()) 
      .findAny() 
      .ifPresent(Window::pushToFront); 
    } 

的方法過濾接觸的id返回一個可選的匹配WINDOWID註冊窗口的列表。如果列表包含具有匹配id的窗口,則存在Optional中的值,然後在其上包含pushToFront方法。與此相比,相同的功能,但用Java編寫的7:

private void pushToFront(AbstractInfo contactInfo) { 
    for (Window window : registeredWindows) { 
     if (window.getWindowId() == contactInfo.getId() { 
      window.pushToFront(); 
     } 
    } 
} 

與lambda表達式,流和方法參考,至少對我的代碼,更簡潔,可讀性(當你使用使用流)。上面的例子非常簡單 - 但考慮一個,在Java 7中需要嵌套循環,多條件條件語句等等。不容易閱讀,更不容易忽視正在發生的事情。

然後,Lambdas允許人們充分利用Java 8的其他簡潔功能,其中包括其他簡潔明瞭,高效且易於理解的代碼。

底線是,你應該考慮lambda表達式作爲一個更大的整體,它是偉大的本身,而是更好時與Java 8

0

除了說了些什麼其他「積木」組合的一部分在這裏,爲了嚴格回答所提出的問題,重要的是將lambda看作是「代碼塊」,除此之外,它可以作爲參數傳遞。這提供了巨大的優勢,因爲您可以刪除重複代碼

那是怎麼回事?在以上由@Kitke提供的示例中,pushToFront(...)方法,如果需求存在,可能會重構一點作爲模板,並用於過濾登錄窗口任何條件。在這種情況下,lambda表達式窗口 - > window.getWindowId()== contactInfo.getId()可以作爲參數傳遞。如果沒有這個強大的功能,您必須編寫,而每當您需要按不同的條件過濾收集時,則需要編寫循環。巨大的收益,重新考慮你的代碼。

提取自:http://www.copypasteisforword.com/notes/lambda-expressions-in-java。在那裏你可以找到另一個lambda用法的例子來刪除重複的代碼。

0

lambda表達式的優點 1.它減少了代碼行。 2.它通過將方法 中的行爲傳遞給收集流API來支持順序執行和並行執行。 3.使用Stream API和lambda表達式,我們可以在集合批量操作的情況下實現更高的效率(並行執行)。

1

另外 - 與匿名類不同,lambda不創建新的作用域,它們與封閉塊/環境共享相同的作用域。

所以:

  1. 它更容易訪問封閉對象 - 普通this參考指包圍類的實例(你不需要說EnclosingClass.this

  2. 有沒有shadowing問題(因爲您不能在封閉示波器中定義與變量名稱相同的局部變量)

相關問題