JDK1.8自学之路-11(Lambda表达式和函数式接口)

Lambda表达式的类型,也称为“目标类型”,Lambda表达式的目标类型必须是函数式接口。函数式接口代表只包含一个抽象方法的接口。函数式接口可以包含多个默认方法、类方法,但只能声明一个抽象方法。

如果采用匿名内部类语法来创建函数式接口的实例,只要实现一个抽象方法即可,在这种情况下即可采用Lambda表达式来创建对象,该表达式创建出来的对象的目标类型就是这个函数式接口。

Java 8专门为函数式接口提供了@FunctionalInterface注解,该注解通常放在接口定义前面,该注解对程序功能没有作用,它用于告诉编译器执行更严格的检查——检查该接口必须是函数式接口,否则就会报错。

Lambda表达式有如下两个限制:

Lambda表达式的目标类型必须是明确的函数式接口。

Lambda表达式只能为函数式接口创建对象。Lambda表达式只能实现一个方法,因此它只能为只有一个抽象方法的接口(函数式接口)创建对象。

为了保证Lambda表达式的目标类型是一个明确的函数式接口,可以有如下三种常见方式:

将Lambda表达式赋值给函数式接口类型的变量。

将Lambda表达式作为函数式接口类型的参数传给某个方法。

使用函数式接口对Lambda表达式进行强制类型转换。

1 代码

@FunctionalInterface
interface FkTest
{
   void run();
}
 
public class LambdaTest
{
   public static void main(String[] args)
   {
      // Runnable接口中只包含一个无参数的方法
      // Lambda表达式代表的匿名方法实现了Runnable接口中唯一的、无参数的方法
      // 因此下面的Lambda表达式创建了一个Runnable对象
      Runnable r = () -> {
         for(int i = 0 ; i < 2 ; i ++)
         {
            System.out.println("Lambda表达式的目标类型必须是明确的函数式接口");
         }
      };
      r.run();
//    // 下面代码报错: 不兼容的类型: Object不是函数接口
//    Object obj = () -> {
//       for(int i = 0 ; i < 100 ; i ++)
//       {
//          System.out.println();
//       }
//    };
 
      Object obj1 = (Runnable)() -> {
         for(int i = 0 ; i < 2 ; i ++)
         {
            System.out.println("对Lambda表达式执行了强制类型转换,这样就可以确定该表达式的目标类型为Runnable函数式接口");
         }
      };
      ((Runnable)obj1).run();
 
      // 同样的Lambda表达式可以被当成不同的目标类型,唯一的要求是:
      // Lambda表达式的形参列表与函数式接口中唯一的抽象方法的形参列表相同
      Object obj2 = (FkTest)() -> {
         for(int i = 0 ; i < 2 ; i ++)
         {
            System.out.println("Lambda表达式的形参列表与函数式接口中唯一的抽象方法的形参列表相同");
         }
      };
      ((FkTest)obj2).run();
 
   }
}


2 运行

Lambda表达式的目标类型必须是明确的函数式接口
Lambda表达式的目标类型必须是明确的函数式接口
对Lambda表达式执行了强制类型转换,这样就可以确定该表达式的目标类型为Runnable函数式接口
对Lambda表达式执行了强制类型转换,这样就可以确定该表达式的目标类型为Runnable函数式接口
Lambda表达式的形参列表与函数式接口中唯一的抽象方法的形参列表相同
Lambda表达式的形参列表与函数式接口中唯一的抽象方法的形参列表相同

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值