@[toc](Java8 函数式接口详解)
### 1、为什么有函数式接口
- 为Lambda表达式、方法和构造方法引用提供目标类型。
- 可以在多个上下文中提供目标类型
```java
Predicate<String> p=String::isEmpty;
stream.map((ToIntFunction)e->e.getSize())…
```
### 2、函数式接口介绍
- 概念
* 有且仅有一个抽象方法,但可以有多个非抽象方法的接口
- 格式
```java
/*
标明为函数式接口的注解,注解可有可无
该注解只是提醒编译器去检查该接口是否包涵一个抽象方法
*/
@FunctionInterface
public abstract MyFunctionInterface{
//一个抽象方法
void mrthod();
//允许定义默认方法
default void add()
//允许定义静态方法
static void uodate();
//允许定义java.lang.Object的public方法
@Override
boolean equals(Object obj);
}
```
### 3、内置函数式接口
**JDK8中引入新包java.util.function,此包中的接口可分为四类**
|类型|说明|
|--|--|
|Function|转换或提取:接收参数,并返回结果,主要方法R apply(T t)|
|Consumer|消费者:接收参数,无返回结果,主要方法void accept(T t)|
|Supplier|供应商:不接收参数,但返回结构,主要方法T get()|
|Predicate|断言:接收参数,返回boolean值,主要方法boolean test(T t)|
==Function(1)接收**一个**参数==
|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)||
==Function(2)接收**两个**参数==
|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)||
==Consumer消费者:接收**两个**参数==
|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<*T*> |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断言==
|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|