1.1 函數式接口里允許定義默認方法:
函數式接口里是可以包含默認方法,因為默認方法不是抽象方法,其有一個(gè)默認實(shí)現,所以是符合函數式接口的定義的;
1.2 函數式接口里允許定義靜態(tài)方法:
函數式接口里是可以包含靜態(tài)方法,因為靜態(tài)方法不能是抽象方法,是一個(gè)已經(jīng)實(shí)現了的方法,所以是符合函數式接口的定義的;
1.3 函數式接口里允許定義Java.lang.Object里的public方法:
函數式接口里是可以包含Object里的public方法,這些方法對于函數式接口來(lái)說(shuō),不被當成是抽象方法(雖然它們是抽象方法);因為任何一個(gè)函數式接口的實(shí)現,默認都繼承了Object類(lèi),包含了來(lái)自java.lang.Object里對這些抽象方法的實(shí)現;
1.4 函數式接口里允許子接口繼承多個(gè)父接口,但每個(gè)父接口中都只能存在一個(gè)抽象方法,且必須的相同的抽象方法。
下面給出幾個(gè)函數式接口的例子:
@FunctionalInterfacepublic 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); }
@FunctionalInterfacepublic interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); …………
@FunctionalInterfacepublic interface A<T> extends Predicate, MyPredicate { /** * 1. * 父接口 MyPredicate與 Predicate中存在相同的抽象方法:boolean test(T t); * 因此子接口中的功能也只有 boolean test(T t); */ /** * 2. * 如果多個(gè)父接口有各自不同的抽象方法,則子接口也會(huì )存在繼承多個(gè)抽象方法 * 此時(shí),子接口就不是函數式接口 */}
2.@FunctionalInterface注解
Java 8為函數式接口引入了一個(gè)新注解@FunctionalInterface,主要用于編譯級錯誤檢查,加上該注解,當你寫(xiě)的接口不符合函數式接口定義的時(shí)候,編譯器會(huì )報錯。加不加@FunctionalInterface對于接口是不是函數式接口沒(méi)有影響,該注解只是提醒編譯器去檢查該接口是否僅包含一個(gè)抽象方法。
3.函數式接口的運用3.1 函數式接口也是接口,依舊可以通過(guò)之前的調用方式,通過(guò)實(shí)現類(lèi)來(lái)使用接口。
public class FunctionalInterfaceTest<T> implements Predicate<T>{ public static void main(String[] args) throws InterruptedException { Predicate p = new FunctionalInterfaceTest(); System.out.println(p.test(1)); } @Override public boolean test(T t) { return 1 % 2 == 0; }}
3.2 通過(guò)Lambda表達式實(shí)現接口抽象方法
public static void main(String[] args) throws InterruptedException { Predicate<Integer> p = a -> a % 2 == 1; System.out.println(p.test(5)); System.out.println(p.test(2));}
3.3 函數式接口與之前編碼的比較
/** * java 8 之前通常使用匿名內部類(lèi)完成 */Collections.sort(dtoList, new Comparator<PlatformCouponOrderDTO>() { @Override public int compare(PlatformCouponOrderDTO a, PlatformCouponOrderDTO b) { return DateUtils.getMinutesBetween(a.getTime(), b.getTime()); } });/** * java 8 之后使用Lambda表達式實(shí)現函數式接口,使代碼量明顯減少許多 */Collections.sort(dtoList, (a, b) -> DateUtils.getMinutesBetween(a.getTime(), b.getTime()));
4.JDK 1.8 新增加的函數接口:
java.util.function 它包含了很多類(lèi),用來(lái)支持 Java的 函數式編程,該包中的函數式接口有:
| 序號 | 接口 & 描述 |
|---|---|
| 1 | BiConsumer<T,U> 代表了一個(gè)接受兩個(gè)輸入參數的操作,并且不返回任何結果 |
| 2 | BiFunction<T,U,R> 代表了一個(gè)接受兩個(gè)輸入參數的方法,并且返回一個(gè)結果 |
| 3 | BinaryOperator<T> 代表了一個(gè)作用于于兩個(gè)同類(lèi)型操作符的操作,并且返回了操作符同類(lèi)型的結果 |
| 4 | BiPredicate<T,U> 代表了一個(gè)兩個(gè)參數的boolean值方法 |
| 5 | BooleanSupplier 代表了boolean值結果的提供方 |
| 6 | Consumer<T> 代表了接受一個(gè)輸入參數并且無(wú)返回的操作 |
| 7 | DoubleBinaryOperator 代表了作用于兩個(gè)double值操作符的操作,并且返回了一個(gè)double值的結果。 |
| 8 | DoubleConsumer 代表一個(gè)接受double值參數的操作,并且不返回結果。 |
| 9 | DoubleFunction<R> 代表接受一個(gè)double值參數的方法,并且返回結果 |
| 10 | DoublePredicate 代表一個(gè)擁有double值參數的boolean值方法 |
| 11 | DoubleSupplier 代表一個(gè)double值結構的提供方 |
| 12 | DoubleToIntFunction 接受一個(gè)double類(lèi)型輸入,返回一個(gè)int類(lèi)型結果。 |
| 13 | DoubleToLongFunction 接受一個(gè)double類(lèi)型輸入,返回一個(gè)long類(lèi)型結果 |
| 14 | DoubleUnaryOperator 接受一個(gè)參數同為類(lèi)型double,返回值類(lèi)型也為double 。 |
| 15 | Function<T,R> 接受一個(gè)輸入參數,返回一個(gè)結果。 |
| 16 | IntBinaryOperator 接受兩個(gè)參數同為類(lèi)型int,返回值類(lèi)型也為int 。 |
| 17 | IntConsumer 接受一個(gè)int類(lèi)型的輸入參數,無(wú)返回值 。 |
| 18 | IntFunction<R> 接受一個(gè)int類(lèi)型輸入參數,返回一個(gè)結果 。 |
| 19 | IntPredicate :接受一個(gè)int輸入參數,返回一個(gè)布爾值的結果。 |
| 20 | IntSupplier 無(wú)參數,返回一個(gè)int類(lèi)型結果。 |
| 21 | IntToDoubleFunction 接受一個(gè)int類(lèi)型輸入,返回一個(gè)double類(lèi)型結果 。 |
| 22 | IntToLongFunction 接受一個(gè)int類(lèi)型輸入,返回一個(gè)long類(lèi)型結果。 |
| 23 | IntUnaryOperator 接受一個(gè)參數同為類(lèi)型int,返回值類(lèi)型也為int 。 |
| 24 | LongBinaryOperator 接受兩個(gè)參數同為類(lèi)型long,返回值類(lèi)型也為long。 |
| 25 | LongConsumer 接受一個(gè)long類(lèi)型的輸入參數,無(wú)返回值。 |
| 26 | LongFunction<R> 接受一個(gè)long類(lèi)型輸入參數,返回一個(gè)結果。 |
| 27 | LongPredicate R接受一個(gè)long輸入參數,返回一個(gè)布爾值類(lèi)型結果。 |
| 28 | LongSupplier 無(wú)參數,返回一個(gè)結果long類(lèi)型的值。 |
| 29 | LongToDoubleFunction 接受一個(gè)long類(lèi)型輸入,返回一個(gè)double類(lèi)型結果。 |
| 30 | LongToIntFunction 接受一個(gè)long類(lèi)型輸入,返回一個(gè)int類(lèi)型結果。 |
| 31 | LongUnaryOperator 接受一個(gè)參數同為類(lèi)型long,返回值類(lèi)型也為long。 |
| 32 | ObjDoubleConsumer<T> 接受一個(gè)object類(lèi)型和一個(gè)double類(lèi)型的輸入參數,無(wú)返回值。 |
| 33 | ObjIntConsumer<T> 接受一個(gè)object類(lèi)型和一個(gè)int類(lèi)型的輸入參數,無(wú)返回值。 |
| 34 | ObjLongConsumer<T> 接受一個(gè)object類(lèi)型和一個(gè)long類(lèi)型的輸入參數,無(wú)返回值。 |
| 35 | Predicate<T> 接受一個(gè)輸入參數,返回一個(gè)布爾值結果。 |
| 36 | Supplier<T> 無(wú)參數,返回一個(gè)結果。 |
| 37 | ToDoubleBiFunction<T,U> 接受兩個(gè)輸入參數,返回一個(gè)double類(lèi)型結果 |
| 38 | ToDoubleFunction<T> 接受一個(gè)輸入參數,返回一個(gè)double類(lèi)型結果 |
| 39 | ToIntBiFunction<T,U> 接受兩個(gè)輸入參數,返回一個(gè)int類(lèi)型結果。 |
| 40 | ToIntFunction<T> 接受一個(gè)輸入參數,返回一個(gè)int類(lèi)型結果。 |
| 41 | ToLongBiFunction<T,U> 接受兩個(gè)輸入參數,返回一個(gè)long類(lèi)型結果。 |
| 42 | ToLongFunction<T> 接受一個(gè)輸入參數,返回一個(gè)long類(lèi)型結果。 |
| 43 | UnaryOperator<T> 接受一個(gè)參數為類(lèi)型T,返回值類(lèi)型也為T(mén)。 |
聯(lián)系客服