Lambda表达式基础(3)-什么是函数式接口?

什么是函数式接口?

通俗地说,一个函数式接口是其类型可作为方法参数,就像一个lambda表达式可作实际参数一样。例如,在集合中的forEach方法可以有以下特征:
forEach方法参数必须传入仅有一个方法的Consumer接口的一个实例。这个实例可能是一个lambda表达式(请参考(4)什么是lambda表达式的类型?),在这种情况下它可以替代该方法。一个Lambda表达式可以以这种方式替代仅含有一个方法的接口,所以若接口只有单一的一个方法,那么使用起来就无歧义。

更确切地说,一个函数式接口被定义为有且只有一个明确的声明为抽象方法的任何接口。 (该限定是必要的,因为一个接口可以有非抽象的默认方法)。这就是为什么函数式接口使用被称为一个抽象方法(SAM)的接口,仍然时不时会出现的一个术语。


根据上面的定义在类库中的下列接口都是函数式接口:
public interface Runnable { void run(); }
public interface Callable<V> { V call() throws Exception; }
public interface ActionListener { void actionPerformed(ActionEvent e); }
public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); }
语法注意事项:
1 接口Comparator 是一个函数式接口因为尽管它声明了两个抽象方法,但equals方法是从Object继承下来的公有方法。接口相比于Object的公有方法总是声明抽象的方法,但这通常是隐式的。无论是隐式或显式声明,这些方法都被排除在外

2【第一次读的时候跳过这条】当两个接口有不同的方法签名,但通过“擦除”相关,在这种情况下可能变得更加复杂。例如如下的两个接口的方法是等效覆盖的:
interface Foo1 { void bar(List<String> arg); }
interface Foo2 { void bar(List arg); }
如果一个接口的父接口包含等效覆盖的方法,该接口的函数描述符被定义为可以合法地覆盖所有继承的抽象方法的方法。在这个例子中,如果
interface Foo extends Foo1, Foo2 {}
那么 Foo 的函数:
void bar(List arg);
事实上,每一个函数式接口具有这样的函数描述符,尽管在更普遍,更简单的情况下,该接口仅仅有单一的抽象方法。

原文链接:http://www.lambdafaq.org/what-is-a-functional-interface/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值