在 java 8 中使用 lambda 表达式有哪些优势?

2022-09-01 15:34:55
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表达式还有其他优点吗?


答案 1

补充@Bilbo在评论中提到的内容。在Java 1.7中,发布了一个名为Java 8 Lambda的新JVM Opcode。因此,下面的代码将导致在编译代码时创建一个匿名类。因此,如果您有10个匿名类,则最终jar中还有10个类。invokedynamic<ClassName>$1.class

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

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

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

答案 2

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

请考虑以下代码:

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

该方法筛选与 windowId 匹配的已注册窗口的列表,其中联系人的 ID 返回“可选”。如果列表包含具有匹配 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的其他“构建块”结合使用时甚至更好。


推荐