前言
函数式接口(Functional Interface)是Java 8对一类特殊类型的接口的称呼。 这类接口只定义了唯一的抽象方法的接口,并且这类接口使用了@FunctionalInterface进行注解。在jdk8中,引入了一个新的包java.util.function, 可以是java 8 的函数式编程变得更加简便。这个package中的接口大致分为了以下四类:
- Function: 接收参数,并返回结果,主要方法 R apply(T t)
- Consumer: 接收参数,无返回结果, 主要方法为 void accept(T t)
- Supplier: 不接收参数,但返回结果,主要方法为 T get()
- Predicate: 接收参数,返回boolean值,主要方法为 boolean test(T t)
本文也按照这四类,来梳理下java8对函数式编程做了哪些支持。
1、Function
Function接口表示一个方法接收参数并返回结果。
1.1 单个参数(一元函数)
1.1.1、参数类型和返回值类型调用处指定
接口 | 方法 | 参数类型 | 返回值类型 |
---|---|---|---|
Function<T,R> | R apply(T t) | T | R |
1.1.2、指定参数类型,返回值类型由调用处指定
接口 | 方法 | 参数类型 | 返回值类型 |
---|---|---|---|
IntFunction< R> | R apply(int value) | int | R |
LongFunction< R> | R apply(long value) | long | R |
Double< R> | R apply(double value) | double | R |
1.1.3、参数类型有调用处指定,指定返回值类型
接口 | 方法 | 参数类型 | 返回值类型 |
---|---|---|---|
ToIntFunction< T> | int applyAsInt(T value) | T | int |
ToLongFunction< T> | long applyAsLong(T value) | T | long |
ToDoubleFunction< T> | double applyAsDouble(T value) | T | double |
1.1.4、既指定了接收参数类型,也指定了返回参数类型
接口 | 方法 | 参数类型 | 返回值类型 |
---|---|---|---|
IntToLongFunction | long applyAsLong(int value) | int | long |
IntToDoubleFunction | double applyAsLong(int value) | int | double |
LongToIntFunction | int applyAsLong(long value) | long | int |
LongToDoubleFunction | double applyAsLong(long value) | long | double |
DoubleToIntFunction | int applyAsLong(double value) | double | int |
DoubleToLongFunction | long applyAsLong(double value) | double | long |
1.1.5、特殊的Function,接收参数类型和返回参数类型一样
接口 | 方法 | 参数类型 | 返回值类型 |
---|---|---|---|
UnaryOperator< T> | T apply(T t) | T | T |
IntUnaryOperator | int applyAsInt(int operand) | int | int |
LongUnaryOperator | long applyAsLong(long operand) | long | long |
DoubleUnaryOperator | double applyAsDouble(double operand) | double | double |
1.2、两个参数(二元函数)
1.2.1、参数类型和返回值类型都由调用处指定
接口 | 方法 | 参数类型 | 返回值类型 |
---|---|---|---|
BiFunction<T,U,R> | R apply(T t, U u) | T,U | R |
1.2.2、指定返回参数类型
接口 | 方法 | 参数类型 | 返回值类型 |
---|---|---|---|
ToIntBiFunction<T,U> | int applyAsInt(T t, U u) | T,U | int |
ToLongBiFunction<T,U> | long applyAsLong(T t, U u) | T,U | long |
ToDoubleBiFunction<T,U> | double appleyAsDouble(T t, U u) | T,U | double |
1.2.3、特殊的BiFunction, 接收参数和返回参数类型一样
接口 | 方法 | 参数类型 | 返回值类型 |
---|---|---|---|
BinaryOperator< T> | T apply(T t, T u) | T,T | T |
IntBinaryOperator | int applyAsInt(int left, int right) | int,int | int |
LongBinaryOperator | long applyAsInt(long left, long right) | long,long | long |
DoubleBinaryOperator | double applyAsInt(double left, double right) | double,double | double |
2、Consumer
表示一个方法接收参数但不产生返回值。
2.1、接受一个参数(一元函数)
接口 | 方法 | 参数类型 | 返回值 |
---|---|---|---|
Consumer< T> | void accept(T t) | T | 无返回值 |
IntConsumer | void accept(int value) | int | 无返回值 |
LongConsumer | void accept(long value) | long | 无返回值 |
DoubleConsumer | void accept(double value) | double | 无返回值 |
2.2、接受两个参数(二元函数)
接口 | 方法 | 参数类型 | 返回值 |
---|---|---|---|
BiConsumer<T,U> | void accept(T t, U u) | T,U | 无返回值 |
ObjIntConsumer< T> | void accept(T t, int value) | T,int | 无返回值 |
ObjLongConsumer< T> | void accept(T t, long value) | T,long | 无返回值 |
ObjDoubleConsumer< T> | void accept(T t, double value) | T,double | 无返回值 |
3、Supplier
返回一个结果,并不要求每次调用都返回一个新的或者独一的结果
接口 | 方法 | 参数类型 | 返回值 |
---|---|---|---|
Supplier< T> | T get() | 无参数 | T |
BooleanSupplier | boolean getAsBoolean() | 无参数 | boolean |
IntSupplier | int getAsInt() | 无参数 | int |
LongSupplier | long getAsLong() | 无参数 | long |
DoubleSupplier | double getAsDouble() | 无参数 | double |
4、Predicate
根据接收参数进行断言,返回boolean类型
接口 | 方法 | 参数类型 | 返回值 |
---|---|---|---|
Predicate< T> | boolean test(T t) | T | boolean |
IntPredicate | boolean test(int value) | int | boolean |
LongPredicate | boolean test(long value) | long | boolean |
DoublePredicate | boolean test(double value) | double | boolean |
BiPredicate<T,U> | boolean test(T t, U u) | T,U | boolean |