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

文章目录

什么是函数式接口

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

相关推荐
长征coder11 分钟前
Maven Deploy的依赖与引用方的依赖不同
java·maven
努力学习的明19 分钟前
Spring MVC 对 JavaWeb 的优化:从核心组件到注解
java·spring·mvc·web
小雅痞21 分钟前
[Java][Leetcode middle] 238. 除自身以外数组的乘积
java·leetcode
小李不想说话33 分钟前
HTTPS 加密原理
java·网络·网络协议·学习·安全·http·https
斯密码赛我是美女35 分钟前
ssti刷刷刷
java·服务器·前端
进击的小白菜1 小时前
Java回溯算法解决非递减子序列问题(LeetCode 491)的深度解析
java·算法·leetcode
众乐乐_20081 小时前
Java 后端给前端传Long值,精度丢失的问题与解决
java·前端·状态模式
北辰浮光1 小时前
[springboot]SSM日期数据转换易见问题
java·spring boot·后端
木梓辛铭2 小时前
Spring Cache的详细使用
java·后端·spring
招风的黑耳2 小时前
Java视频流RTMP/RTSP协议解析与实战代码
java·视频流