认识函数式接口

本文介绍Java8中函数式接口的概念及其与Lambda的关系。函数式接口是一种含有唯一抽象方法的接口,如Runnable和新的java.util.function包中的Predicate、Function、Consumer、Supplier等。通过示例展示了如何使用Lambda表达式简化函数式接口的实现。
摘要由CSDN通过智能技术生成

在上一节中我们谈到Java8对原有的接口进行了增强,除此之外,Java8中还提出了一个新名词——函数式接口1(Functional Interface),用来特指某类型的接口。这类接口中定义了唯一的抽象方法,在早期这类接口被叫做SAM类型接口(single abstract interface),比如我们常见的Runnable接口。需要注意的是接口的默认方法和静态方法并不影响一个接口成为函数式接口。

除了早期存在的Runnable,Comparator等函数式接口之外,jdk8中又增加了java.util.function包,其中提供了常用的函数式接口,比如:

  1. Predicate
  2. Function
  3. Consumer
  4. Supplier

另外,java 8中也提供了@FunctionalInterface注解用于标记一个接口是函数式接口,该注解被用来显式告知用户这是一个函数式接口,java并不强制要求要为函数式接口标记此注解。实际上一个接口是否是函数式接口由虚拟机来判断。这里我们自行定义一个函数式接口:

public class FunctionalInterfaceTest {
    public static void main(String[] args) {
       Calculate calculate=new Calculate() {
            @Override
            public void applay(int i) {
                System.out.println(i);
            }
        };
        calculate.applay(8);
    }

   @FunctionalInterface
    interface Calculate {
        void applay(int i);
    }
}

看完示例代码,你可能觉得它和普通接口的使用也没有什么不同,那为什么java团队会提出函数式接口这个概念呢?其根本原因在于:函数式接口完全是为了Java 中Lambda的实现而定义的。在lambda的实现过程中,java开发团队选择利用SAM接口作为Lambda表达式的目标类型,凡是在函数式接口出现的地方,都可以接受一个Lambda表达式作为函数式接口的实现。(Lambda表达式不能脱离上下文单独存在,它必须要有一个明确的目标类型,该目标类型也就是函数式接口)

到现在我们彻底明白函数式接口完全是为实现Lambda而提出的。那现在我们利用Lambda表达式来改写上例:

public class FunctionalInterfaceTest {
    public static void main(String[] args) {
        Calculate calculate = param ->System.out.println(param);
        calculate.applay(8);
    }

   @FunctionalInterface
    interface Calculate {
        void applay(int i);
    }
}

到现在为止,我们已经认识了函数式接口,它将帮助我们理解Lambda的使用场景。


  1. 也被叫做功能性接口,两者是同一回事。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值