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

文章目录

什么是函数式接口

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

相关推荐
zaim11 小时前
计算机的错误计算(一百一十四)
java·c++·python·rust·go·c·多项式
hong_zc3 小时前
算法【Java】—— 二叉树的深搜
java·算法
进击的女IT3 小时前
SpringBoot上传图片实现本地存储以及实现直接上传阿里云OSS
java·spring boot·后端
Miqiuha4 小时前
lock_guard和unique_lock学习总结
java·数据库·学习
一 乐5 小时前
学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习
数云界5 小时前
如何在 DAX 中计算多个周期的移动平均线
java·服务器·前端
阑梦清川5 小时前
Java继承、final/protected说明、super/this辨析
java·开发语言
快乐就好ya6 小时前
Java多线程
java·开发语言
IT学长编程7 小时前
计算机毕业设计 二手图书交易系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·spring boot·毕业设计·课程设计·毕业论文·计算机毕业设计选题·二手图书交易系统
CS_GaoMing7 小时前
Centos7 JDK 多版本管理与 Maven 构建问题和注意!
java·开发语言·maven·centos7·java多版本