函数式接口


  虽然Lambda表达式可以实现匿名内部类的功能,但在使用时却有一个局限,即接口中有且只有一个抽象方法时才能使用Lamdba表达式代替匿名内部类。这是因为Lamdba表达式是基于函数式接口实现的,所谓函数式接口是指有且仅有一个抽象方法的接口,Lambda表达式就是Java中函数式编程的体现,只有确保接口中有且仅有一个抽象方法,Lambda表达式才能顺利地推导出所实现的这个接口中的方法。
  在JDK 8中,专门为函数式接口引入了一个@FunctionalInterface注解,该注解只是显示的标注了接口是一个函数式接口,并强制编辑器进行更严格的检查,确保该接口是函数式接口,如果不是函数式接口,那么编译器就会报错,而对程序运行并没有实质上的影响。
  接下来通过一个案例来演示函数式接口的定义与使用,示例代码如下所示。

 1	// 定义无参、无返回值的函数式接口
 2	@FunctionalInterface
 3	interface Animal {
 4		void shout();
 5	}
 6	// 定义有参、有返回值的函数式接口
 7	interface Calculate {
 8		int sum(int a, int b);
 9	}
 10	public class Example23 {
 11		public static void main(String[] args) {
 12		   // 分别两个函数式接口进行测试
 13		   animalShout(() -> System.out.println("无参、无返回值的函数式接口调用"));
 14		   showSum(10, 20, (x, y) -> x + y);
 15		}
 16		// 创建一个动物叫的方法,并传入接口对象Animal作为参数
 17		private static void animalShout(Animal animal) {
 18			animal.shout();
 19		}
 20		// 创建一个求和的方法,并传入两个int类型以及接口Calculate类型的参数
 21		private static void showSum(int x, int y, Calculate calculate) {
 22		   System.out.println(x + "+" + y + "的和为:" + calculate.sum(x, y));
 23		}
 24	}

  运行结果如下图所示。

alt   上述代码示例中,先定义了两个函数式接口Animal和Calculate,然后在测试类中分别编写了两个静态方法,并将这两个函数式接口以参数的形式传入,最后在main()方法中分别调用这两个静态方法,并将所需要的函数式接口参数以Lambda表达式的形式传入。从图中可以看出,程序中函数式接口的定义和使用完全正确。

用户想要评论,请先登录!
  1. 这是一篇不错的文章!