函數(shù)式接口
函數(shù)式接口本質(zhì)是一個(gè)接口,但是他是一個(gè)只有一個(gè)抽象方法的特殊接口。也稱作SAM接口,即Single Abstract Method interfaces。舉一個(gè)常舉的例子:
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
default Predicate<T> negate() {
return (t) -> !test(t);
}
default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
}
函數(shù)接口可以(可以而不是必須)采用@FunctionalInterface 注解,
可以包涵以下成員:
- 用default 定義的默認(rèn)方法,默認(rèn)方法不是抽象的,其包涵一個(gè)默認(rèn)實(shí)現(xiàn)。(也就是有方法體)
- 用static 定義的靜態(tài)方法,靜態(tài)方法是一個(gè)已經(jīng)實(shí)現(xiàn)了的方法,不是抽象方法。
- Object類自帶的方法,如toString,equals等方法。
必須包含以下
必須有一個(gè)抽象方法。因?yàn)楹瘮?shù)接口本質(zhì)是接口,所以不需要abstract修飾。
函數(shù)接口的繼承,函數(shù)接口也可以繼承,但是無論繼承幾個(gè)接口,繼承后的函數(shù)接口必須只有一個(gè)抽象方法(這個(gè)方法可以是定義在自己,也可以是繼承自父接口),如果有多個(gè),那么這個(gè)接口就不是函數(shù)接口。
編寫的時(shí)候如果加入@FunctionalInterface有助于編譯檢查,不符合以上條件的函數(shù)接口是會(huì)報(bào)錯(cuò)的。
@FunctionalInterface
public interface PczhuFunctionInterface {
int pczhu(int a);
}
可以普通實(shí)現(xiàn):
PczhuFunctionInterface pczhuFunctionInterfaceimpl = new PczhuFunctionInterface() {
@Override
public int pczhu(int a) {
return a + 5;
}
};
也可以用lambda表達(dá)式
PczhuFunctionInterface pczhuFunctionInterfaceImpl = a -> a + 5;
JDK 1.8 新增加的函數(shù)接口:(表格取材位置:http://blog.csdn.net/yangjiachang1203/article/details/52619795)
| 序號(hào) | 說明 |
|---|---|
| 1 | BiConsumer<T,U> |
| 代表了一個(gè)接受兩個(gè)輸入?yún)?shù)的操作,并且不返回任何結(jié)果 | |
| 2 | BiFunction<T,U,R> |
| 代表了一個(gè)接受兩個(gè)輸入?yún)?shù)的方法,并且返回一個(gè)結(jié)果 | |
| 3 | BinaryOperator<T> |
| 代表了一個(gè)作用于于兩個(gè)同類型操作符的操作,并且返回了操作符同類型的結(jié)果 | |
| 4 | BiPredicate<T,U> |
| 代表了一個(gè)兩個(gè)參數(shù)的boolean值方法 | |
| 5 | BooleanSupplier |
| 代表了boolean值結(jié)果的提供方 | |
| 6 | Consumer<T> |
| 代表了接受一個(gè)輸入?yún)?shù)并且無返回的操作 | |
| 7 | DoubleBinaryOperator |
| 代表了作用于兩個(gè)double值操作符的操作,并且返回了一個(gè)double值的結(jié)果。 | |
| 8 | DoubleConsumer |
| 代表一個(gè)接受double值參數(shù)的操作,并且不返回結(jié)果。 | |
| 9 | DoubleFunction<R> |
| 代表接受一個(gè)double值參數(shù)的方法,并且返回結(jié)果 | |
| 10 | DoublePredicate |
| 代表一個(gè)擁有double值參數(shù)的boolean值方法 | |
| 11 | DoubleSupplier |
| 代表一個(gè)double值結(jié)構(gòu)的提供方 | |
| 12 | DoubleToIntFunction |
| 接受一個(gè)double類型輸入,返回一個(gè)int類型結(jié)果。 | |
| 13 | DoubleToLongFunction |
| 接受一個(gè)double類型輸入,返回一個(gè)long類型結(jié)果 | |
| 14 | DoubleUnaryOperator |
| 接受一個(gè)參數(shù)同為類型double,返回值類型也為double 。 | |
| 15 | Function<T,R> |
| 接受一個(gè)輸入?yún)?shù),返回一個(gè)結(jié)果。 | |
| 16 | IntBinaryOperator |
| 接受兩個(gè)參數(shù)同為類型int,返回值類型也為int 。 | |
| 17 | IntConsumer |
| 接受一個(gè)int類型的輸入?yún)?shù),無返回值 。 | |
| 18 | IntFunction<R> |
| 接受一個(gè)int類型輸入?yún)?shù),返回一個(gè)結(jié)果 。 | |
| 19 | IntPredicate |
| :接受一個(gè)int輸入?yún)?shù),返回一個(gè)布爾值的結(jié)果。 | |
| 20 | IntSupplier |
| 無參數(shù),返回一個(gè)int類型結(jié)果。 | |
| 21 | IntToDoubleFunction |
| 接受一個(gè)int類型輸入,返回一個(gè)double類型結(jié)果 。 | |
| 22 | IntToLongFunction |
| 接受一個(gè)int類型輸入,返回一個(gè)long類型結(jié)果。 | |
| 23 | IntUnaryOperator |
| 接受一個(gè)參數(shù)同為類型int,返回值類型也為int 。 | |
| 24 | LongBinaryOperator |
| 接受兩個(gè)參數(shù)同為類型long,返回值類型也為long。 | |
| 25 | LongConsumer |
| 接受一個(gè)long類型的輸入?yún)?shù),無返回值。 | |
| 26 | LongFunction<R> |
| 接受一個(gè)long類型輸入?yún)?shù),返回一個(gè)結(jié)果。 | |
| 27 | LongPredicate |
| R接受一個(gè)long輸入?yún)?shù),返回一個(gè)布爾值類型結(jié)果。 | |
| 28 | LongSupplier |
| 無參數(shù),返回一個(gè)結(jié)果long類型的值。 | |
| 29 | LongToDoubleFunction |
| 接受一個(gè)long類型輸入,返回一個(gè)double類型結(jié)果。 | |
| 30 | LongToIntFunction |
| 接受一個(gè)long類型輸入,返回一個(gè)int類型結(jié)果。 | |
| 31 | LongUnaryOperator |
| 接受一個(gè)參數(shù)同為類型long,返回值類型也為long。 | |
| 32 | ObjDoubleConsumer<T> |
| 接受一個(gè)object類型和一個(gè)double類型的輸入?yún)?shù),無返回值。 | |
| 33 | ObjIntConsumer<T> |
| 接受一個(gè)object類型和一個(gè)int類型的輸入?yún)?shù),無返回值。 | |
| 34 | ObjLongConsumer<T> |
| 接受一個(gè)object類型和一個(gè)long類型的輸入?yún)?shù),無返回值。 | |
| 35 | Predicate<T> |
| 接受一個(gè)輸入?yún)?shù),返回一個(gè)布爾值結(jié)果。 | |
| 36 | Supplier<T> |
| 無參數(shù),返回一個(gè)結(jié)果。 | |
| 37 | ToDoubleBiFunction<T,U> |
| 接受兩個(gè)輸入?yún)?shù),返回一個(gè)double類型結(jié)果 | |
| 38 | ToDoubleFunction<T> |
| 接受一個(gè)輸入?yún)?shù),返回一個(gè)double類型結(jié)果 | |
| 39 | ToIntBiFunction<T,U> |
| 接受兩個(gè)輸入?yún)?shù),返回一個(gè)int類型結(jié)果。 | |
| 40 | ToIntFunction<T> |
| 接受一個(gè)輸入?yún)?shù),返回一個(gè)int類型結(jié)果。 | |
| 41 | ToLongBiFunction<T,U> |
| 接受兩個(gè)輸入?yún)?shù),返回一個(gè)long類型結(jié)果。 | |
| 42 | ToLongFunction<T> |
| 接受一個(gè)輸入?yún)?shù),返回一個(gè)long類型結(jié)果。 | |
| 43 | UnaryOperator<T> |
| 接受一個(gè)參數(shù)為類型T,返回值類型也為T。 |