java8-04-初识函数式接口
为什么用函数式接口
在函数式编程思想下,允许函数本身作为参数传入另一个函数.使用函数式接口实现"传递行为"的思想.
Lambda表达式也需要函数式接口的支持
什么是函数式接口
总结: 函数式接口 只有一个抽象方法 函数式接口的标识@FunctionalInterface
解释
1.如果一个接口只有一个抽象方法 那么这个接口就是一个函数式接口
2.如果我们在某个接口上声明了@FunctionalInterface注解 那么编译器就会按照函数式接口的定义来要求该接口 不符合报错
3.如果某个接口只有一个抽象方法 但该接口并没有声明@FunctionalInterface注解 编译器仍然会将该接口看作函数式接口
4.如果是函数式接口 该接口也重写了Object类的公共的抽象方法 该重写方法不会增加该接口的抽象方法个数
该接口仍然是函数式接口 不会报错
因为Object类是所有的类的父类 该函数式接口如果有实现类 会直接实现Object类的这个抽象方法
不会实现该函数接口中重写了Object类的抽象方法
也就是说该函数式接口 不会把重写了Object类的公共的抽象方法 看作是抽象方法
该函数式接口的抽象方法仍然是一个 所以符合函数式接口的定义
怎么用函数式接口
自定义一个函数式接口
a.正确的 ![]()

b. 错误的 不符合只有一个抽象方法 
c. 正确的 可以有Object公共的抽象方法 (回看解释4) ![]()

开始使用函数式接口
1.Test2类中 myTest()方法 将自定义函数式接口 MyInterface 作为参数 调用自定义函数接口中test()方法
2.使用Lambda表达式代替匿名内部类
3.Lambda表达式是对象 使用时 必须 依附于 函数式接口
控制台打印如下

1 package com.wf.zhang.java8; 2 3 @FunctionalInterface 4 interface MyInterface { 5 void test(); 6 String toString(); 7 } 8 9 public class Test2{ 10 11 public void myTest(MyInterface myInterface){ 12 System.out.println(1); 13 myInterface.test(); 14 System.out.println(2); 15 } 16 17 18 public static void main(String[] args) { 19 Test2 test2 = new Test2(); 20 21 //1.使用匿名内部类 22 test2.myTest(new MyInterface() { 23 @Override 24 public void test() { 25 System.out.println("使用匿名内部类==mytest"); 26 } 27 }); 28 29 //2.使用Lambda表达式 30 test2.myTest(()->{ 31 System.out.println("使用Lambda表达式--mytest"); 32 }); 33 34 //3.使用Lambda表达式表示myInterface Lambda表达式是一个对象 35 MyInterface myInterface = ()->{ 36 System.out.println("使用Lambda表达式表示myInterface"); 37 }; 38 39 40 System.out.println("myInterface的class---->"+myInterface.getClass()); 41 System.out.println(" myInterface 父类---> "+myInterface.getClass().getSuperclass()); 42 System.out.println(" myInterface的接口-->"+myInterface.getClass().getInterfaces()); 43 System.out.println(" myInterface的长度 "+myInterface.getClass().getInterfaces().length); 44 System.out.println(" myInterface的内容 "+myInterface.getClass().getInterfaces()[0]); 45 } 46 47 }
古人学问无遗力,少壮工夫老始成。
纸上得来终觉浅,绝知此事要躬行。