Java中内置的函数式接口详解(附中文说明)
在Java 8引入函数式编程特性后,函数式接口成为了现代Java开发中不可或缺的一部分。然而,在实际开发中,许多开发者常常陷入重复定义接口的困境,这不仅导致代码冗余,还给后期维护带来了不必要的麻烦。本文将全面介绍Java内置的函数式接口,帮助开发者快速掌握这些现成的工具,提升代码质量和开发效率。
简单展示函数式接口的魅力
无需创建实现类,简简单单第一行代码搞定
import java.util.function.BiFunction;
class Main {
public static void main(String[] args) {
// 定义一个 BiFunction,计算两个整数的乘积
BiFunction
// 使用 BiFunction 计算 5 和 10 的乘积
int result = multiply.apply(5, 10);
// 输出结果
System.out.println("5 和 10 的乘积是: " + result);
}
}
一、函数式接口概述
函数式接口(Functional Interface)是指仅包含一个抽象方法的接口。Java 8通过@FunctionalInterface注解来标识这类接口,编译器会强制检查接口是否符合函数式接口的定义。使用内置的函数式接口可以:
减少重复代码,提高代码复用性
使代码更加简洁易读
统一代码风格,便于团队协作
降低维护成本,提高开发效率
二、Java内置函数式接口一览
以下是Java中主要的内置函数式接口及其说明:
1. 通用函数式接口
接口名称
中文名
参数类型
返回类型
说明
Function
单参函数
T
R
接受一个参数并返回结果
BiFunction
双参函数
T, U
R
接受两个参数并返回结果
Consumer
单参消费者
T
void
接受一个参数但不返回结果
BiConsumer
双参消费者
T, U
void
接受两个参数但不返回结果
Supplier
提供者
无
T
不接收参数但返回结果
Predicate
单参断言
T
boolean
接受一个参数并返回布尔值
BiPredicate
双参断言
T, U
boolean
接受两个参数并返回布尔值
2. 原始类型特化接口
2.1 原始类型函数接口
接口名称
中文名
参数类型
返回类型
说明
IntFunction
整型函数
int
R
接受int参数并返回结果
LongFunction
长整型函数
long
R
接受long参数并返回结果
DoubleFunction
双精度函数
double
R
接受double参数并返回结果
ToIntFunction
转整型函数
T
int
接受参数并返回int值
ToLongFunction
转长整型函数
T
long
接受参数并返回long值
ToDoubleFunction
转双精度函数
T
double
接受参数并返回double值
2.2 原始类型转换接口
接口名称
中文名
参数类型
返回类型
说明
IntToLongFunction
整型转长整型
int
long
接受int参数并返回long值
IntToDoubleFunction
整型转双精度
int
double
接受int参数并返回double值
LongToIntFunction
长整型转整型
long
int
接受long参数并返回int值
LongToDoubleFunction
长整型转双精度
long
double
接受long参数并返回double值
DoubleToIntFunction
双精度转整型
double
int
接受double参数并返回int值
DoubleToLongFunction
双精度转长整型
double
long
接受double参数并返回long值
2.3 原始类型消费者接口
接口名称
中文名
参数类型
返回类型
说明
IntConsumer
整型消费者
int
void
接受int参数但不返回结果
LongConsumer
长整型消费者
long
void
接受long参数但不返回结果
DoubleConsumer
双精度消费者
double
void
接受double参数但不返回结果
ObjIntConsumer
对象整型消费者
T, int
void
接受对象和int参数但不返回结果
ObjLongConsumer
对象长整型消费者
T, long
void
接受对象和long参数但不返回结果
ObjDoubleConsumer
对象双精度消费者
T, double
void
接受对象和double参数但不返回结果
2.4 原始类型提供者接口
接口名称
中文名
参数类型
返回类型
说明
IntSupplier
整型提供者
无
int
不接收参数但返回int值
LongSupplier
长整型提供者
无
long
不接收参数但返回long值
DoubleSupplier
双精度提供者
无
double
不接收参数但返回double值
BooleanSupplier
布尔型提供者
无
boolean
不接收参数但返回boolean值
2.5 原始类型断言接口
接口名称
中文名
参数类型
返回类型
说明
IntPredicate
整型断言
int
boolean
接受int参数并返回布尔值
LongPredicate
长整型断言
long
boolean
接受long参数并返回布尔值
DoublePredicate
双精度断言
double
boolean
接受double参数并返回布尔值
3. 运算符接口
接口名称
中文名
参数类型
返回类型
说明
UnaryOperator
一元运算符
T
T
接受一个参数并返回同类型结果(Function的特例)
BinaryOperator
二元运算符
T, T
T
接受两个同类型参数并返回同类型结果(BiFunction的特例)
IntUnaryOperator
整型一元运算符
int
int
接受int参数并返回int值
LongUnaryOperator
长整型一元运算符
long
long
接受long参数并返回long值
DoubleUnaryOperator
双精度一元运算符
double
double
接受double参数并返回double值
IntBinaryOperator
整型二元运算符
int, int
int
接受两个int参数并返回int值
LongBinaryOperator
长整型二元运算符
long, long
long
接受两个long参数并返回long值
DoubleBinaryOperator
双精度二元运算符
double, double
double
接受两个double参数并返回double值
4. 其他函数式接口
接口名称
中文名
参数类型
返回类型
说明
Runnable
可运行任务
无
void
不接收参数也不返回结果,用于执行任务
Comparator
比较器
T, T
int
接受两个参数并返回比较结果
三、使用建议
优先使用内置接口:在大多数情况下,内置函数式接口已经能够满足需求,应优先考虑使用它们。
注意类型匹配:对于原始类型操作,使用对应的特化接口可以避免自动装箱/拆箱带来的性能开销。
保持代码简洁:合理使用Lambda表达式和方法引用,可以使代码更加简洁易读。
适当自定义接口:当内置接口确实无法满足需求时,再考虑自定义函数式接口,但要注意保持接口的单一职责。
结语
掌握Java内置的函数式接口是编写现代Java代码的基本功。通过合理使用这些接口,开发者可以显著提高代码质量和开发效率。希望本文能帮助读者更好地理解和运用这些强大的工具,在函数式编程的道路上越走越远。
记住:优秀的开发者不仅要会写代码,更要懂得利用语言提供的工具来写出更好的代码。