什么是Java中的“SAMtypes”?

阅读Java-8规范,我总是看到“SAMtypes”的引用。 我一直无法find这是什么的明确解释。

什么是SAMtypes,什么时候可以使用什么样的情况?

为了总结Jon所发布的链接 ,“SAM”代表“单一抽象方法”,“SAM-type”代表RunnableCallable等接口Runnableexpression式是Java 8中的一个新特性,被认为是SAMtypes,可以自由地转换成它们。

例如,用这样的界面:

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

你可以使用lambdaexpression式来声明一个Callable

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

在这种情况下,Lambdaexpression式大多只是语法糖。 它们比匿名类更好看,对方法命名的限制更less。 从链接中得到这个例子:

 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不共享相同名称的特定方法创build一个Comparator ,这样您就不必遵循方法的接口命名,并且可以在一个类中有多个比较覆盖,然后创build比较器通过lambdaexpression式在飞行中。


作为旁注,链接上的语法已过时。 看看Lambda Expressions Java Trail来看看当前的语法。