与方法变量相比,lambda 表达式有什么优势?

Nic*_*ick 1 java reflection lambda

我对 lambda 表达式很陌生,所以请耐心等待。假设我有一个带有单个抽象函数的接口:

public interface IAbsFunc {
    public abstract void absFunc(int x);
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我可以将 lambda 表达式存储在变量中:

public class Lambda {
    public static void main(String[] args) {
        IAbsFunc obj = (int x) -> System.out.println(x);
        obj.absFunc(3);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我理解正确,这就像将方法存储在变量中。但是,这已经可以通过 java.lang.reflect 完成:

public class Lambda {
    public static void main(String[] args) throws Exception {
        Method obj = PrintStream.class.getDeclaredMethod("println", int.class);
        obj.invoke(System.out, 3);
    }
}
Run Code Online (Sandbox Code Playgroud)

显然我在这里遗漏了一些东西。在什么情况下 lambda 表达式更可取?

aku*_*ykh 5

您应该了解反射 API 的用途。它专为您设计的其他语言功能无法实现或难以实现的功能而设计。

一个官方文件指出一个(和海事组织最重要的)用例:

调试器需要能够检查类的私有成员。测试工具可以利用反射来系统地调用定义在类上的可发现集 API,以确保测试套件中的高水平代码覆盖率。

因此,在您希望完全访问您测试的代码的测试中,使用反射非常有用。您可以访问private方法和字段,可以更改final字段等。文档说明了一个很大的缺点:

由于反射涉及动态解析的类型,因此无法执行某些 Java 虚拟机优化。因此,反射操作的性能比非反射操作慢,应避免在对性能敏感的应用程序中频繁调用的代码段中使用。

灵活性伴随着性能缺陷。您可以在我链接的文档中找到更多用例和缺点。

在您的情况下,在此处使用 lambda 正是 lambda 应该用于的用途(除其他外)。在这里使用反射并不是反射的目的。你可以,但你不应该。