函数式接口@FunctionInterface

java8提倡函数式编程,因而新增了一个函数式接口。函数式接口保证了函数式编程,同时也保证了能够兼容以前的java版本。

1.1 定义

在java8中,满足下面任意一个条件的接口都是函数式接口:

  • 1、被@FunctionInterface注释的接口,满足@FunctionInterface注释的约束。
  • 2、没有被@FunctionInterface注释的接口,但是满足@FunctionInterface注释的约束

1.2 @FunctionInterface注释的约束

  • 1、接口有且只能有一个抽象方法,只有方法定义,没有方法体
  • 2、在接口中覆写Object类中的public方法,不算是函数式接口的方法

1.3 示例

//接口一 
@FunctionalInterface 
public interface FunctionInterfaceTest { 
    String getInfo(String input); 
    @Override 
    String toString(); //Object中的方法 
    @Override 
    boolean equals(Object obj); //Object中的方法 
} 
//接口二 
@FunctionalInterface 
public interface FunctionInterfaceTest { 
    String getInfo(String input); 
} 
//接口三 
public interface FunctionInterfaceTest { 
    String getInfo(String input); 
}

1.4 函数式接口示例的创建

函数式接口实例的创建有三种方式:1、lambda表达式;2、方法引用;3、构造方法引用。

public class Main{
    public static void main(String[] args){
        /**
         * 1、lambda表达式
         * 这种形式最为直观,lambda表达式,接收一个String类型的参数,返回一个String类型的结果
         * 完全符合函数式接口FunctionInterfaceTest的定义
         */
        FunctionInterfaceTest functionInterfaceTest1 = item -> item+1;
        
        /**
         * 2、方法调用
         * Main方法当中的getIntance和getMessage方法接收一个参数,返回一个结果。符合函数式接口
         * FunctionInterfaceTest的定义
         * 函数式接口只是定义了方法的约定(接收一个String类型的参数,返回一个String类型的结果)
         * 而对于方法内部进行何种操作则并没有做任何的限制。在这点上,跟java以前的版本中的实现类与接口之间的很类似。
         * 不同的是,函数式接口更偏重于计算过程,约束了一个计算过程的输入和输出
        */
        FunctionInterfaceTest functionInterfaceTest2 = Main::getInstance; //方法引用
        FunctionInterfaceTest functionInterfaceTest3 = Main::getMessage; //方法引用

        String msg1 = joinStr("你好",functionInterfaceTest2); //输出:你好!世界
        String msg2 = joinStr("你好",functionInterfaceTest3); //输出:世界,你好!
        System.out.println(msg1);
        System.out.println(msg2);

        //还有更简单的写法,高度抽象化,具体处理由使用者自己决定
        String msg3 = joinStr("你好",item ->item+"!世界");
        String msg4 = joinStr("你好",item ->"世界,"+item+"!");
        System.out.println(msg3);
        System.out.println(msg4);

        /**
        3、构造方法引用
        构造函数的结构:接收输入参数,然后返回一个对象。这种约束跟函数式接口的约束很像
        所以只要“输入参数类型”与“输出参数类型”跟FunctionInterfaceTest中的方法约束相同,
        就可以创建出FunctionInterfaceTest接口的实例,如下,String的构造方法中有new String(str)的构造方法,所以可以得到实例
        这里存在一个类型推断的问题,JDK的编译器已经帮我们自动找到了只有一个参数且是String类型的构造方法。
        这就是我们可以直接String::new,没有指定是用哪一种构造方法,却可以创建实例的原因。
        */
        FunctionInterfaceTest functionInterfaceTest4 = String::new; //方法引用
    }

    public static String getInstance(String item){
         return item+"!世界";
     }
     
     public static String getMessage(String massage){
         return "世界,"+ massage+"!";
     }
     
     public  static String joinStr(String str,FunctionInterfaceTest functionTest){
         return functionTest.getInfo(str);
     }
}

本文转自:函数式接口@FunctionInterface - 码农教程 (manongjc.com)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值