函数式接口

  Java中已经有很多封装代码块的接口,如ActionListener或者Comparator。lamdba表达式与这些接口是兼容的。

  对于只有一个抽象方法的接口,需要这种接口的对象是,就可以提供一个lamdba表达式。这种接口称为函数式接口(functional interface)。

  注释:你可能想知道为什么函数式接口必须有一个抽象方法。不是接口中的所有方法都是抽象的吗?实际上,接口完全有可能重新声明Object类的方法, 如 toString或clone,这些声明有可能会让方法不再是抽象的。(JavaAPI中的一些接口会重新声明Object方法来附加javadoc注释ComparatorAP丨就是这样一个例子。)更重要的是,在JavaSE8中,接口可以声明非抽象方法

  为了展示如何转换为函数式接口,下面考虑Arrays.sort方法。它的第二个参数需要一个Comparator实例,Comparator就是只有一个方法的接口,所以可以提供一个 lambda 表达式:

Arrays .sort (words ,
(first, second) -> first.lengthO - second.lengthO);

  在底层,Arrays.sort方法会接收实现了Comparator 的某个类的对象。在这个对象上调用 compare 方法会执行这个lambda表达式的体。这些对象和类的管理完全取决于具体实现,与使用传统的内联类相比,这样可能要高效得多。最好把lambda表达式看作是一 个函数,而不是一个对象,另外要接受lambda表达式可以传递到函数式接口。

  lamdba表达式可以转换为接口。

  实际上,在Java中,对lambda表达式所能做的也只是能转换为函数式接口。在其他支持函数字面量的程序设计语言中,可以声明函数类型(如(String,String)-> int)、声明这些类型的变量,还可以使用变量保存函数表达式。不过,Java设计者还是决定保持我们熟悉的接 口概念,没有为Java语言增加函数类型。

  注释:甚至不能把lambda表达式赋给类型为Object的变量,Object不是一个函数式接口。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值