Java 8 函数式接口归纳

Java 8 函数式接口

JDK 8 也有一段时间了,这个过程中也不免用到一些函数式接口,这里简单做个总结。

函数式接口:为了支持将lambda表达式作为参数传入接口中,Java 8 定义了函数式接口的概念,函数式接口一般只有一个抽象的方法,并且通过@FunctionalInterface标记。

在日常开发中,如果我们想让自己定义的方法支持传入一个lambda表达式,有两种方法可以做到:

  • 自己定义一个函数式接口
  • 使用JDK自带的函数式接口

一般来说,都推荐第二种,因为JDK自带函数式接口基本都能满足日常所用。并且使用通用的接口能让你的API更加通俗,减少其他人阅读源码时的不必要的学习。并且JDK自带的函数式接口提供了很多通用的的默认方法。

JDK一共提供了43个函数式接口,不过分类来看差不多有4类,记住这4类中每一类最通用的接口便能理解其他的接口,他们分别为:

  • Function<T>函数类接口,此接口方法接收参数,并返回结果
    • Operator<T>操作类接口,特殊的函数类接口,此接口方法的参数和结果类型相同
  • Predicate<T>断言类接口,此接口接受一个参数并返回一个布尔值

  • Supplier<T>生产类接口,此接口不接受参数,但是会有返回值
  • Consumer<T>消费类接口,此接口只接受参数,但是不会有返回值

可以发现函数式接口的分类都是根据参数和返回类型进行分类,因此想要记住他们并不困难。

可能有些人比较疑惑Consumer<T>会怎么使用,此类接口用在消费对象的时候,比如发消息,更典型的比如:System.out::println

如果需要更加细分的话,还有根据参数个数进行区分。不过对于基本数据类型,上述接口都有基本数据类型的变体,主要是为了不必要的BoxUnBox操作。

Function

表示一个方法接收参数并返回结果。

接收单个参数

Interface functional method 说明
Function<T,R> R apply(T t) 接收参数类型为T,返回参数类型为R
IntFunction<R> R apply(int value) 以下三个接口,指定了接收参数类型,返回参数类型为泛型R
LongFunction<R> R apply(long value)
Double<R> R apply(double value)
ToIntFunction<T> int applyAsInt(T value) 以下三个接口,指定了返回参数类型,接收参数类型为泛型T
ToLongFunction<T> long applyAsLong(T value)
ToDoubleFunction<T> double applyAsDouble(T value)
IntToLongFunction long applyAsLong(int value) 以下六个接口,既指定了接收参数类型,也指定了返回参数类型
IntToDoubleFunction double applyAsLong(int value)
LongToIntFunction int applyAsLong(long value)
LongToDoubleFunction double applyAsLong(long value)
DoubleToIntFunction int applyAsLong(double value)
DoubleToLongFunction long applyAsLong(double value)
UnaryOperator<T> T apply(T t) 特殊的Function,接收参数类型和返回参数类型一样
IntUnaryOperator int applyAsInt(int left, int right) 以下三个接口,制定了接收参数和返回参数类型,并且都一样
LongUnaryOperator long applyAsInt(long left, long right)
DoubleUnaryOperator double applyAsInt(double left, double right)

接收两个参数

interface functional method 说明
BiFunction<T,U,R> R apply(T t, U u) 接收两个参数的Function
ToIntBiFunction<T,U> int applyAsInt(T t, U u) 以下三个接口,指定了返回参数类型,接收参数类型分别为泛型T, U
ToLongBiFunction<T,U> long applyAsLong(T t, U u)
ToDoubleBiFunction<T,U> double appleyAsDouble(T t, U u)
BinaryOperator<T> T apply(T t, T u) 特殊的BiFunction, 接收参数和返回参数类型一样
IntBinaryOperator int applyAsInt(int left, int right)
LongBinaryOperator long applyAsInt(long left, long right)
DoubleBinaryOperator double applyAsInt(double left, double right)

Consumer

表示一个方法接收参数但不产生返回值。

接收一个参数

interface functional method 说明
Consumer<T> void accept(T t) 接收一个泛型参数,无返回值
IntConsumer void accept(int value) 以下三个类,接收一个指定类型的参数
LongConsumer void accept(long value)
DoubleConsumer void accept(double value)

接收两个参数

interface functional method 说明
BiConsumer<T,U> void accept(T t, U u) 接收两个泛型参
ObjIntConsumer<T> void accept(T t, int value) 以下三个类,接收一个泛型参数,一个指定类型的参
ObjLongConsumer<T> void accept(T t, long value)
ObjDoubleConsumer void accept(T t, double value)

Supplier

返回一个结果,并不要求每次调用都返回一个新的或者独一的结果

interface functional method 说明
Supplier<T> T get() 返回类型为泛型T
BooleanSupplier boolean getAsBoolean() 以下三个接口,返回指定类型
IntSupplier int getAsInt()
LongSupplier long getAsLong()
DoubleSupplier double getAsDouble()

Predicate

根据接收参数进行断言,返回boolean类型

interface functional method 说明
Predicate<T> boolean test(T t) 接收一个泛型参数
IntPredicate boolean test(int value) 以下三个接口,接收指定类型的参数
LongPredicate boolean test(long value)
DoublePredicate boolean test(double value)
BiPredicate<T,U> boolean test(T t, U u) 接收两个泛型参数,分别为T,U

尊重劳动成果,转载注明出处

[参考链接]

《Effective Java》 3th

java 8 函数式接口