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 }
View Code

 

posted @ 2019-11-02 16:48  wf.zhang  阅读(220)  评论(0编辑  收藏  举报