java都有哪些默认的函数接口

用户问的是 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. Function<T, R>

  • 参数:1 个泛型参数 T
  • 返回值:泛型类型 R
  • 用途:将输入参数转换为另一个类型的结果。
    • 示例方法:R apply(T t)
    • 扩展:Function.andThen(Function)Function.compose(Function) 用于组合函数。

2. Consumer<T>

  • 参数:1 个泛型参数 T
  • 返回值:无(void
  • 用途:对输入参数进行消费(处理),不返回结果。
    • 示例方法:void accept(T t)
    • 扩展:Consumer.andThen(Consumer) 用于链式消费。

3. Supplier<T>

  • 参数:无
  • 返回值:泛型类型 T
  • 用途:生产(提供)一个指定类型的对象,通常无输入参数。
    • 示例方法:T get()

4. Predicate<T>

  • 参数:1 个泛型参数 T
  • 返回值:布尔值(boolean
  • 用途:对输入参数进行条件判断,返回布尔结果。
    • 示例方法:boolean test(T t)
    • 扩展:Predicate.and()Predicate.or()Predicate.negate() 用于逻辑组合。

二、双参数函数接口(以 Bi 开头)

1. BiFunction<T, U, R>

  • 参数:2 个泛型参数 T 和 U
  • 返回值:泛型类型 R
  • 用途:接收两个参数并返回一个结果,扩展自 Function
    • 示例方法:R apply(T t, U u)

2. BiConsumer<T, U>

  • 参数:2 个泛型参数 T 和 U
  • 返回值:无(void
  • 用途:消费两个参数,不返回结果。
    • 示例方法:void accept(T t, U u)
    • 典型应用:Map.forEach((k, v) -> ...)

3. BinaryOperator<T>

  • 参数:2 个相同类型的参数 T
  • 返回值:同类型 T
  • 用途:对两个相同类型的参数进行操作,返回同类型结果(BiFunction<T, T, T> 的子接口)。
    • 示例方法:T apply(T t, T u)
    • 典型场景:数值运算、集合归约(如 Integer::sum)。

4. UnaryOperator<T>

  • 参数:1 个泛型参数 T
  • 返回值:同类型 T
  • 用途:对单个参数进行操作,返回同类型结果(Function<T, T> 的子接口)。
    • 示例方法:T apply(T t)
    • 典型场景:字符串转换(如 String::toUpperCase)。

三、基本类型特化接口(避免自动装箱)

为 intlongdouble 等基本类型设计的特化接口,提升性能:

1. 针对输入参数的特化

  • IntConsumer:参数 int,无返回值(对应 Consumer<Integer>)。
  • LongConsumerDoubleConsumer:类似 IntConsumer,针对 long 和 double

2. 针对返回值的特化

  • IntSupplier:返回 int(对应 Supplier<Integer>)。
  • LongSupplierDoubleSupplier:类似 IntSupplier

3. 输入和返回均为基本类型

  • IntFunction<R>:参数 int,返回 R(对应 Function<Integer, R>)。
  • ToIntFunction<T>:参数 T,返回 int(如 T -> int)。
  • IntToDoubleFunction:参数 int,返回 double(用于类型转换)。

四、其他特殊函数接口

1. Runnable(位于 java.lang,非 java.util.function

  • 参数:无
  • 返回值:无(void
  • 用途:表示一个可执行的任务(线程任务),经典函数式接口(单抽象方法 run())。

2. Callable<V>(位于 java.util.concurrent

  • 参数:无
  • 返回值:泛型类型 V(可抛出异常)
  • 用途:表示一个可返回结果的任务,配合 Future 使用。

总结

Java 默认的函数接口通过 单抽象方法 支持 Lambda 表达式,主要分类如下:

  • 转换FunctionUnaryOperator、基本类型特化转换接口(如 IntFunction)。
  • 消费ConsumerBiConsumer、基本类型消费者(如 IntConsumer)。
  • 生产Supplier、基本类型生产者(如 IntSupplier)。
  • 判断Predicate(布尔条件判断)。
  • 双参数操作BiFunctionBinaryOperator(参数 / 返回值相同)。
  • 特殊场景Runnable(无参无返回)、Callable(无参有返回)。

这些接口覆盖了大多数函数式编程场景,结合 Lambda 和方法引用能显著简化代码逻辑。
posted @ 2025-04-28 11:41  CharyGao  阅读(26)  评论(0)    收藏  举报