gpt4 book ai didi

java - Java 中的 'SAM type' 是什么?

转载 作者:IT老高 更新时间:2023-10-28 11:21:04 25 4
gpt4 key购买 nike

阅读 Java-8 规范后,我不断看到对“SAM 类型”的引用。我一直无法找到关于这是什么的明确解释。

什么是 SAM 类型以及何时可以使用的示例场景是什么?

最佳答案

总结the link Jon posted 1 万一出现故障,“SAM”代表“单一抽象方法”,“SAM-type”指的是像 RunnableCallable< 这样的接口(interface) 等。Java 8 中的新特性 Lambda 表达式被视为 SAM 类型,可以自由转换为它们。

例如,使用这样的界面:

public interface Callable<T> {
public T call();
}

您可以使用 lambda 表达式声明一个 Callable,如下所示:

Callable<String> strCallable = () -> "Hello world!";
System.out.println(strCallable.call()); // prints "Hello world!"

这种上下文中的 Lambda 表达式大多只是语法糖。它们在代码中看起来比匿名类更好,并且对方法命名的限制较少。从链接中获取此示例:

class Person { 
private final String name;
private final int age;

public static int compareByAge(Person a, Person b) { ... }

public static int compareByName(Person a, Person b) { ... }
}

Person[] people = ...
Arrays.sort(people, Person::compareByAge);

这将使用与 Comparator.compare 不同名称的特定方法创建一个 Comparator,这样您就不必遵循接口(interface)命名方法,您可以在一个类中拥有多个比较覆盖,然后通过 lambda 表达式动态创建比较器。

深入...

在更深层次上,Java 使用 Java 7 中添加的 invokedynamic 字节码指令来实现这些。我之前说过,声明 Lambda 会创建 Callable 的实例>Comparable 类似于匿名类,但 严格 不正确。相反,第一次调用 invokedynamic 时,它会使用 LambdaMetafactory.metafactory method 创建一个 Lambda 函数处理程序。 ,然后在以后的 Lambda 调用中使用这个缓存的实例。更多信息请访问 this answer .

这种方法很复杂,甚至包括可以直接从堆栈内存读取原始值和引用以传递到您的 Lambda 代码的代码(例如,为了避免需要分配一个 Object[] 数组来调用你的 Lambda),但它允许 Lambda 实现的 future 迭代来替换旧的实现,而不必担心字节码的兼容性。如果 Oracle 的工程师在较新版本的 JVM 中更改了底层 Lambda 实现,则在较旧 JVM 上编译的 Lambda 将自动使用较新的实现,而无需开发人员进行任何更改。


1 链接上的语法已过期。看看Lambda Expressions Java Trail查看当前语法。

关于java - Java 中的 'SAM type' 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17913409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com