Lambda表达式和函数式接口

试问怎么调用接口中的抽象函数

方法一:写一个类实现接口中的抽象方法,然后创建这个类的对象调用该类重写后的方法。

方法二:使用匿名内部类创建匿名内部类的对象。

        // 匿名内部类实现重写接口的抽象方法
        new test03() {
            @Override
            public void name() {
                // TODO Auto-generated method stub
            }
        };

匿名内部类的出现简化代码。lamdba表达式的出现有进一步的简化了匿名内部类的代码  

public class Dome01 {
    public static void main(String[] args) {
        //分别使用匿名内部类和lamdba表达式
        TestInterface testInterface = new TestInterface() {
            @Override
            public void print() {
                System.out.println("我爱java");
            }
        };
        testInterface.print();
        
        //lamdba 
        TestInterface testInterface2 = () ->{System.out.println("我爱java");};
        testInterface2.print();
    }

}

interface TestInterface { // 定义一个接口
    void print();
}

lamdba表达式的标准格式

Lambda省去面向对象的条条框框,格式由3个部分组成:
  • 一些参数
  • 一个箭头
  • 一段代码
Lambda表达式的标准格式为:
(参数类型 参数名称) ‐> { 代码语句 }
格式说明:
  • 小括号内的语法与传统方法参数列表一致:无参数则留空;多个参数则用逗号分隔。
  • -> 是新引入的语法格式,代表指向动作。
  • 大括号内的语法与传统方法体要求基本一致。

 函数式接口

函数式接口在Java中是指:有且仅有一个抽象方法的接口。
函数式接口,即适用于函数式编程场景的接口。而Java中的函数式编程体现就是Lambda,所以函数式接口就是可
以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导。
格式:
只要确保接口中有且仅有一个抽象方法即可:
修饰符 interface 接口名称 {
     public abstract 返回值类型 方法名称(可选参数信息); // 其他非抽象方法内容
}
由于接口当中抽象方法的 public abstract 是可以省略的,所以定义一个函数式接口很简单:
public interface MyFunctionalInterface { void myMethod(); }
FunctionalInterface注解:
与 @Override 注解的作用类似,Java 8中专门为函数式接口引入了一个新的注解: @FunctionalInterface 。该注 解可用于一个接口的定义上:
@FunctionalInterface
public interface MyFunctionalInterface {
      void myMethod();
  }
一旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有一个抽象方法,否则将会报错。不过,即使不使用该注解,只要满足函数式接口的定义,这仍然是一个函数式接口,使用起来都一样。
个人学习,内容简略
posted @ 2020-08-10 19:38  一生的风景  阅读(1135)  评论(0编辑  收藏  举报