函数式接口的定义及常见类型

文章目录

什么是函数式接口

函数式接口是一个具有且仅有一个抽象方法(Abstract Method)的接口。在Java中,函数式接口被用于支持函数式编程的特性,允许将函数作为一等公民来传递和使用。函数式接口具有以下特点:

  • 只包含一个抽象方法,但可以包含默认方法和静态方法。
  • 可以使用@FunctionalInterface注解进行标识,以确保它符合函数式接口的规范。(该注解不是必需的)

这种接口可以通过Lambda表达式、方法引用来表示简洁的实现方式。函数式接口的设计允许将行为作为参数传递,使得代码更加简洁和可读。

函数式接口的语法

在 Java 中,函数式接口通常使用 @FunctionalInterface 注解进行标记,这样编译器可以检查该接口是否符合函数式接口的定义。如果一个接口声明了多个抽象方法,或者没有声明任何抽象方法,都不能被标记为函数式接口,否则会产生编译错误。

函数式接口的定义示例:

java 复制代码
@FunctionalInterface
interface MyFunctionalInterface {
    void myMethod(); // 抽象方法

    // 允许存在默认方法
    default void defaultMethod() {
        // 实现代码
    }
	
    // 允许存在静态方法
    static void staticMethod() {
        // 实现代码
    }
}

在函数式接口中,可以包含静态方法和默认方法,而这些方法与接口中的抽象方法不同。

  • 抽象方法: 函数式接口必须包含且仅包含一个抽象方法。Lambda 表达式通过实现这个抽象方法来创建接口的实例。
  • 默认方法: 默认方法是在接口中提供了一个默认的实现,可以在实现类中选择性地重写。Lambda 表达式可以忽略默认方法,因为它们不会影响接口的单一抽象方法的约束。
  • 静态方法: 静态方法在接口中提供了一个静态的实用工具方法。与默认方法一样,Lambda 表达式不需要显式地实现接口中的静态方法,因为静态方法与实例方法无关。

函数式接口中的默认方法和静态方法的作用主要是组合 lambda 表达式

基本函数式接口

Java 8引入了一些常用的内置函数式接口,它们位于java.util.function 包中。这些函数式接口也在JDK API中大量使用,尤其是在集合框架和流API中。

函数式接口种类有 40 多种,但最基本的只有 supplierconsumerpredicatefunction 这四种。

函数式接口 抽象方法名 描述 其他方法
Supplier T get(); 不接受参数但返回一个结果的函数。通常用于创建对象。
Consumer<T> void accept(T t); 接受一个参数并执行某种操作但不返回结果的函数。 andThen
Predicate<T> boolean test(T t); 接受一个参数并返回布尔值的函数,用于条件判断。 and, or, negate, isEqual
Function<T,R> R apply(T t); 接受一个参数并返回一个结果的函数。通常用于在Stream API中将对象映射到其他对象 andThen, compose, identity
Comparator int compare(T o1, T o2); 接受两个参数并返回一个整数。通常用于排序
Callable<V> V call(); 不接受参数但返回一个结果的函数,用于并发任务
Runnable void run(); 不接受参数且不返回结果的函数,用于并发任务

定制化函数接口

在这最基本的函数式接口的基础上,还有一些定制化的函数式接口,适用于特定的需求或操作::

  • 部分函数式接口接受的参数更多, 比如 BiConsumer
  • 部分函数式接口避免了自动装箱和自动拆箱的开销, 以采用的类型命名,比如 IntSupplier
函数式接口 抽象方法名 描述 其他方法
IntSupplier int getAsInt(); 不接受参数但返回一个结果的函数。避免了自动装箱和自动拆箱的开销。
BiConsumer void accept(T t, U u); 接受两个参数并执行某种操作但不返回结果的函数 andThen
BiPredicate<T, U> boolean test(T t, U u); 接受两个参数并返回布尔值的函数,用于条件判断。 and, or, negate, isEqual
BiFunction<T, U, R> R apply(T t, U u); 接受两个参数并返回一个结果的函数 andThen

更多的细节查看 Using Lambdas Expressions in Your Application - Dev.java

参考资料

Using Lambdas Expressions in Your Application - Dev.java

Java 8 新特性:函数式接口(Functional Interface)_java functionalinterface-CSDN博客

【Java 基础篇】Java 函数式接口详解-腾讯云开发者社区-腾讯云 (tencent.com)

相关推荐
JH30739 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
Coder_Boy_10 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
invicinble10 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟10 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖10 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
qq_124987075312 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
Coder_Boy_12 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Mr_sun.12 小时前
Day06——权限认证-项目集成
java
瑶山12 小时前
Spring Cloud微服务搭建四、集成RocketMQ消息队列
java·spring cloud·微服务·rocketmq·dashboard
abluckyboy12 小时前
Java 实现求 n 的 n^n 次方的最后一位数字
java·python·算法