在java 8中使用lambda表达式有什么好处?

Pra*_*aki 19 java lambda java-8

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);
}
Run Code Online (Sandbox Code Playgroud)

除了减少代码行数之外,在java 8中使用lambda表达式还有什么其他优点吗?

sha*_*zin 20

添加@Bilbo在评论中提到的内容.在Java 1.7中,发布了一个名为invokedynamicJava 8 Lambda 的新JVM操作码.因此,以下代码将导致在编译代码时创建Anonymous类.可能<ClassName>$1.class如此,如果你有10个匿名类,那么在最后一个jar中还有10个类.

AccountService accountServiceAnonymous = new AccountService(){
    public void createAccount(){
        Account account = new Account();
        save(account);
    }
};
Run Code Online (Sandbox Code Playgroud)

但是Java 8 lambda invokedynamic用来调用lambdas,因此如果你有10个lambdas,它将不会导致任何匿名类,从而减少最终的jar大小.

AccountService accountServiceLambda = () -> {
    Account account = new Account();
    save(account);
}
Run Code Online (Sandbox Code Playgroud)


tta*_*ski 7

当您将它们与Stream API和Java 8中添加的其他功能(例如Optional)结合使用时,lambdas(和方法引用)的另一个优点是可见的.

考虑以下代码:

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

该方法过滤与windowId匹配的已注册窗口列表,其中联系人的id返回Optional.如果列表包含具有匹配id的窗口,则可以使用Optional中的值,然后使用pushToFront方法.将其与相同的功能进行比较,但是用Java 7编写:

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

至少对我来说,带有lambda表达式,流和方法引用的代码更简洁和可读(当你习惯使用流时).上面的例子非常简单 - 但考虑一个,在Java 7中需要嵌套循环,多个条件语句等.不容易阅读甚至更难以忽略正在发生的事情.

Lambda然后允许人们充分利用Java 8的其他整洁功能,其中包括整洁,干净,高效且易于理解的代码.

最重要的是,您应该将lambda表达式视为更大整体的一部分,这对于他们自己来说很好,但与Java 8的其他"构建块"结合使用时更好.


小智 6

lambda 表达式的优点

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


Ash*_*h A 6

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

所以:

  1. 访问封闭对象更容易——普通this引用是指封闭类的实例(你不需要说EnclosingClass.this

  2. 没有阴影问题(因为您不能定义与封闭范围内的变量同名的局部变量)