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
如果需要更加细分的话,还有根据参数个数进行区分。不过对于基本数据类型,上述接口都有基本数据类型的变体,主要是为了不必要的Box
和UnBox
操作。
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