用户问的是 Java 有哪些默认的函数接口。首先,我需要回忆 Java 中的函数式接口,特别是 Java 8 及以后引入的那些,因为函数式接口是随着 Lambda 表达式一起推广的。默认的函数接口应该是指 Java 标准库中提供的那些,比如 java.util.function 包下的接口。
首先,java.util.function 包下有很多常用的函数接口,比如 Function、Consumer、Supplier、Predicate 这些。然后需要分类整理,比如按参数和返回值来分,单参数、双参数,有返回值或无返回值的情况。还要注意特殊的,比如 Bi 开头的双参数接口,比如 BiFunction、BiConsumer。另外,针对基本类型的特化接口,比如 IntFunction、DoubleConsumer 等,这些可以避免自动装箱拆箱,提高效率。
还有一些比较特殊的,比如 UnaryOperator 和 BinaryOperator,它们是 Function 和 BiFunction 的子接口,用于操作符的情况。另外,Consumer 的 andThen 方法,Predicate 的组合方法,这些默认方法也是函数接口的一部分特性。需要确保覆盖主要的接口,并说明它们的参数和返回值,以及常用场景,比如 Consumer 用于消费数据,Supplier 用于生产数据,Predicate 用于条件判断,Function 用于转换等。
还要注意是否有遗漏的接口,比如 Runnable 和 Callable,虽然它们在 java.lang 包下,但也是函数式接口,不过用户可能更关注 java.util.function 中的。需要确认这些是否属于 “默认” 的范畴,通常默认的函数接口指的是标准库中提供的,所以应该包括。另外,要区分函数式接口的定义,即只有一个抽象方法,可能有默认方法和静态方法,比如 Predicate 的 or、and、negate 等。
总结一下,应该分几类来列出:基础型(Function, Consumer, Supplier, Predicate),双参数型(BiFunction, BiConsumer, BinaryOperator),基本类型特化型(IntFunction, LongSupplier 等),以及特殊用途的如 UnaryOperator,还有可能提到 Runnable 和 Callable 作为早期的函数式接口。每个接口需要简要说明参数、返回值和用途,这样用户能清楚每个接口的适用场景。
在 Java 中,默认的函数接口(即 Java 标准库提供的常用函数式接口)主要集中在 java.util.function 包中,用于支持 Lambda 表达式和方法引用。以下是主要的默认函数接口分类及说明:
- 参数:1 个泛型参数
T
- 返回值:泛型类型
R
- 用途:将输入参数转换为另一个类型的结果。
- 示例方法:
R apply(T t)
- 扩展:
Function.andThen(Function)、Function.compose(Function) 用于组合函数。
- 参数:1 个泛型参数
T
- 返回值:无(
void)
- 用途:对输入参数进行消费(处理),不返回结果。
- 示例方法:
void accept(T t)
- 扩展:
Consumer.andThen(Consumer) 用于链式消费。
- 参数:无
- 返回值:泛型类型
T
- 用途:生产(提供)一个指定类型的对象,通常无输入参数。
- 参数:1 个泛型参数
T
- 返回值:布尔值(
boolean)
- 用途:对输入参数进行条件判断,返回布尔结果。
- 示例方法:
boolean test(T t)
- 扩展:
Predicate.and()、Predicate.or()、Predicate.negate() 用于逻辑组合。
- 参数:2 个泛型参数
T 和 U
- 返回值:泛型类型
R
- 用途:接收两个参数并返回一个结果,扩展自
Function。
- 参数:2 个泛型参数
T 和 U
- 返回值:无(
void)
- 用途:消费两个参数,不返回结果。
- 示例方法:
void accept(T t, U u)
- 典型应用:
Map.forEach((k, v) -> ...)
- 参数:2 个相同类型的参数
T
- 返回值:同类型
T
- 用途:对两个相同类型的参数进行操作,返回同类型结果(
BiFunction<T, T, T> 的子接口)。
- 示例方法:
T apply(T t, T u)
- 典型场景:数值运算、集合归约(如
Integer::sum)。
- 参数:1 个泛型参数
T
- 返回值:同类型
T
- 用途:对单个参数进行操作,返回同类型结果(
Function<T, T> 的子接口)。
- 示例方法:
T apply(T t)
- 典型场景:字符串转换(如
String::toUpperCase)。
为 int、long、double 等基本类型设计的特化接口,提升性能:
IntConsumer:参数 int,无返回值(对应 Consumer<Integer>)。
LongConsumer、DoubleConsumer:类似 IntConsumer,针对 long 和 double。
IntSupplier:返回 int(对应 Supplier<Integer>)。
LongSupplier、DoubleSupplier:类似 IntSupplier。
IntFunction<R>:参数 int,返回 R(对应 Function<Integer, R>)。
ToIntFunction<T>:参数 T,返回 int(如 T -> int)。
IntToDoubleFunction:参数 int,返回 double(用于类型转换)。
- 参数:无
- 返回值:无(
void)
- 用途:表示一个可执行的任务(线程任务),经典函数式接口(单抽象方法
run())。
- 参数:无
- 返回值:泛型类型
V(可抛出异常)
- 用途:表示一个可返回结果的任务,配合
Future 使用。
Java 默认的函数接口通过 单抽象方法 支持 Lambda 表达式,主要分类如下:
- 转换:
Function、UnaryOperator、基本类型特化转换接口(如 IntFunction)。
- 消费:
Consumer、BiConsumer、基本类型消费者(如 IntConsumer)。
- 生产:
Supplier、基本类型生产者(如 IntSupplier)。
- 判断:
Predicate(布尔条件判断)。
- 双参数操作:
BiFunction、BinaryOperator(参数 / 返回值相同)。
- 特殊场景:
Runnable(无参无返回)、Callable(无参有返回)。
这些接口覆盖了大多数函数式编程场景,结合 Lambda 和方法引用能显著简化代码逻辑。