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

文章目录

什么是函数式接口

函数式接口是一个具有且仅有一个抽象方法(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)

相关推荐
披着羊皮不是狼16 分钟前
HTTP 与 API 入门:理解前后端交互原理
java·网络协议·http·交互
2401_8414956426 分钟前
【操作系统】模拟真实操作系统核心功能的Java实现
java·操作系统·进程管理·系统调用·并发控制·中断处理·cpu调度
程序员皮皮林1 小时前
Java 25 正式发布:更简洁、更高效、更现代!
java·开发语言·python
好家伙VCC1 小时前
**发散创新:AI绘画编程探索与实践**随着人工智能技术的飞速发展,AI绘
java·人工智能·python·ai作画
勇者无畏4041 小时前
基于 Spring AI Alibaba 搭建 Text-To-SQL 智能系统(前置介绍)
java·后端·spring·prompt·embedding
练习时长一年1 小时前
IDEA开发常用快捷键总结
java·ide·intellij-idea
温柔53291 小时前
仓颉语言异常捕获机制深度解析
java·服务器·前端
运维李哥不背锅1 小时前
Ansible 的变量与模板:实现更灵活的自动化配置
java·自动化·ansible
信码由缰1 小时前
Java 21 虚拟线程 vs 缓存线程池与固定线程池
java
踩坑小念1 小时前
进程 线程 协程基本概念和区别 还有内在联系
java·linux·jvm·操作系统