在java 8中使用lambda表达式的优点是什么?

问题描述:

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

简而言之:更少的样板代码=更多的可维护性。 –

添加到@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

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

除了说了些什么其他“积木”组合的一部分在这里,为了严格回答所提出的问题,重要的是将lambda看作是“代码块”,除此之外,它可以作为参数传递。这提供了巨大的优势,因为您可以删除重复代码

那是怎么回事?在以上由@Kitke提供的示例中,pushToFront(...)方法,如果需求存在,可能会重构一点作为模板,并用于过滤登录窗口任何条件。在这种情况下,lambda表达式窗口 - > window.getWindowId()== contactInfo.getId()可以作为参数传递。如果没有这个强大的功能,您必须编写,而每当您需要按不同的条件过滤收集时,则需要编写循环。巨大的收益,重新考虑你的代码。

提取自:http://www.copypasteisforword.com/notes/lambda-expressions-in-java。在那里你可以找到另一个lambda用法的例子来删除重复的代码。

lambda表达式的优点 1.它减少了代码行。 2.它通过将方法 中的行为传递给收集流API来支持顺序执行和并行执行。 3.使用Stream API和lambda表达式,我们可以在集合批量操作的情况下实现更高的效率(并行执行)。

另外 - 与匿名类不同,lambda不创建新的作用域,它们与封闭块/环境共享相同的作用域。

所以:

  1. 它更容易访问封闭对象 - 普通this参考指包围类的实例(你不需要说EnclosingClass.this

  2. 有没有shadowing问题(因为您不能在封闭示波器中定义与变量名称相同的局部变量)