什麼是函數式接口?
就是一個有且僅有一個抽象方法,但是可以有多個非抽象方法的接口。
函數式接口可以被隱式轉換為 lambda 表達式。
特點
例如自己定義一個接口
public interface MyInter{ boolean test(boolean test); default andThen(){}}
這個就一個函數式接口。
這個接口我們使用的時候就可以轉化成lambda表達式。
JDK 1.8 之前已有的函數式接口:
JDK 1.8 新增加的函數接口:
java.util.function 它包含了很多類,用來支持 Java的 函數式編程。
但是
對於函數式接口的裡面,我希望不要局限於,java.util.function包裡面的接口。
什麼意思?
就是說我們抓住函數式接口的特點,一個抽象接口,很多個非抽象接口。java.util.function包裡面的接口只是我們眾多實現的一小部分而已。
接下來,我帶領大家,讀下java.util.function幾個接口的源碼,希望大家理解後,其他的一眼就知道怎麼使用,自己重新自定義。
誤區:當時我開始看源碼的時候,我總在想Consumer消費者,這個單詞的含義,那就是說明這個接口是用來表示消費的。然後一直理解單詞的意思。用單詞的意思來猜想功能記憶。這樣是不對的。
我們要忘記這個單詞意思,而是回歸它的實現,因為過兩天,我可以定義一模一樣的只是換了一個單詞名稱。
@FunctionalInterfacepublic interface BiConsumer<T, U> { void accept(T t, U u);eption if {@code after} is null */ default BiConsumer<T, U> andThen(BiConsumer<? super T, ? super U> after) { Objects.requireNonNull(after); return (l, r) -> { accept(l, r); after.accept(l, r); }; }}
BiConsumer這個玩意的抽象方法,有兩個參數T,U然後無返回。
也就是使用的時候,我們是傳了兩個參數進來,然後兩個參數進行一些列操作,andThen就是後面再執行一次其他的accept。
我們這樣理解後,就知道如果我們有需求,傳入兩個參數,不用返回,就可以使用BiConsumer,再次說明請忘記Consumer的英文單詞意思,只不過就是消費兩個參數,不返回,所以才用Consumer一個簡單名稱定義而已。
接下來看使用。
需求,用戶BiConsumer,列印兩個參數的和
public static void main(String[] args) { BiConsumer<Integer,Integer> addConsumer = (x,y)->{ System.out.println(x+y); }; addConsumer.accept(1,3); }
定義兩個輸入參數
(x,y)->
操作內容是列印x+y
System.out.println(x+y);
那我們現在假設一個功能,輸入兩個Integer,判斷是否相等。我們先搜索java.util.function包裡面是否有這種類似的函數接口。
搜索到了,BitFunction。來看它的定義
@FunctionalInterfacepublic interface BiFunction<T, U, R> { R apply(T t, U u); default <V> BiFunction<T, U, V> andThen(Function<? super R, ? extends V> after) { Objects.requireNonNull(after); return (T t, U u) -> after.apply(apply(t, u)); }}
它有三個參數,輸入T,U執行方法後返回R
注意,別在意BitFunction的名稱,我們記住實現就可以了。
來看使用。
BiFunction<Integer,Integer,Boolean> booleanBiFunction = (x,y) ->x.equals(y);System.out.println(booleanBiFunction.apply(1,1));
看到這裡我相信大家一定理解了,函數式接口就那麼回事情。
最後我們自己來定義一個函數接口。
需求:日期格式化,第一個參數輸入時間Date,第二參數輸入日期格式化,返回格式化的日期String。
@FunctionalInterfacepublic interface DateLambda { String format(Date date,String format);}public static void main(String[] args) { DateLambda dateLambda = (date, format) -> { SimpleDateFormat data = new SimpleDateFormat(format); return data.format(date); }; System.out.println(dateLambda.format(new Date(),&34;)); }
實現完畢
至於java.util.function中的其他方法,大家自己看一眼應該就知道怎麼使用了。
學海無涯苦做舟,唯有總結才能終!
本篇主要表達了如下觀點:
推薦閱讀