什么是Java中的“SAMtypes”?
阅读Java-8规范,我总是看到“SAMtypes”的引用。 我一直无法find这是什么的明确解释。
什么是SAMtypes,什么时候可以使用什么样的情况?
为了总结Jon所发布的链接 ,“SAM”代表“单一抽象方法”,“SAM-type”代表Runnable
, Callable
等接口Runnable
expression式是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来看看当前的语法。