摘要:但這里為了解釋上面的問題,彬哥還是得多啰嗦幾句。這個方法誰能告訴我這是什么鬼彬哥現在也不知道,這還真不是彬哥故意賣關子。但是,方法的參數和返回值是需要我們關心和注意的。
大家有沒有發現java.util.function包(本文后面簡稱function包)下的接口雖然比較多(目前共43個),但都是定義很簡單的(方法很少),而我們理解起來卻十分的困難。其實啊,這也不怪大家,是因為這個包下的接口并不是典型的Java的API,你可以說它們是“異類”。那么問題來了,典型的Java API是什么樣子的呢?function包下的接口又“異”在哪里?
總所周知,Java是一種典型的OOP(面向對象編程)語言,封裝、繼承、多態自不必多說,大家想必都十分清楚了。但這里為了解釋上面的問題,彬哥還是得多啰嗦幾句。面向對象一個很重要的標識就是,把結構和行為封裝到一個類(對象)中。
典型的Java API就是這樣子的,舉個大家都很熟悉的例子:java.util.List。List是一個接口,是接口就只有方法,沒有屬性。但是,咱們來看看的List中的方法:size()、isEmpty()、contains(Object o)等等,按照正常人的思維,很容易、也很自然會將這些方法理解成:“假設我是個List的對象(實例)話,你們調用我的size()方法,我會將我的size告訴你;調用我的isEmpty()方法,我會告訴你我是不是空的;調用我的contains()方法,我會告訴你我是不是包含了你指定的這個對象”。大家有沒有發現點什么?所有這些方法,很自然的加入到“我”這個語境(context)中去了。
那么再來看看這個咱們這個專題的主角function包看,找個典型代表出來:java.util.function.Consumer
它們沒有自己的結構,只定義行為,這很不OOP,但很FP(Functional Programming),所以你可以說,從JDK 8開始,函數也可以被稱作Java世界中的“第一公民”了。
來看個具體的例子,java.lang.Iterable的forEach方法:
default void forEach(Consumer super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }
它的參數就是個Consumer,從forEach這個方法的定義來看,現在我們可以理解到“遍歷我所包含的所有元素,對每個元素都執行一次action.accept()”,還有點抽象?不過已經有些好理解了是吧?咱們再進一步看:
Listlist = new ArrayList<>(); list.add("Hello "); list.add("彬哥!"); list.forEach(s -> System.out.println(s)); // 這里當然也可以用更為簡潔的方法引用來改寫
現在在具體的語境里來理解就很容易了,“對于list中的每一個元素,執行我傳進去的那個函數--Consumer”。可能咱們每天都在用類似的寫法,但可能從來都沒有意識到,那原來就是個Consumer啊。這不怪大家,因為“它們都是無意義的”,就像在這里,你根本不需要知道我們其實最后是調用的了Consumer的accept方法。
其實啊,所有java.util.function包下的接口的方法名,我們都不必關心,因為當我們用它們的時候,壓根不會去顯式地調用它們,方法名也是“無意義”的,它們只是方便大家去理解他的用途。但是,方法的參數和返回值是需要我們關心和注意的。
function包下總共有43個接口,嗯~看上去數量還是不少。不必害怕,其實滿打滿算也就這么5類:
Function、Supplier、Consumer、Predicate、Operator。這么看就很少了吧。這還不只,它們還有很多相似的地方,咱們再根據這些相似點分類、舉一反三,就會簡單很多。這里先按照這些共性的點,給這43個接口細分下歸類:
Function類
一元:Function
原始類型
作為參數:DoubleFunction,IntFunction,LongFunction
作為返回值:ToDoubleFunction,ToIntFunction,ToLongFunction
相互轉化:DoubleToIntFunction,DoubleToLongFunction,IntToDoubleFunction,IntToLongFunction,LongToDoubleFunction,LongToIntFunction
二元:BiFunction
原始類型
作為返回值:ToDoubleBiFunction,ToIntBiFunction,ToLongBiFunction
Supplier類
一元:Supplier
原始類型
作為返回值:BooleanSupplier,DoubleSupplier,IntSupplier,LongSupplier
Consumer類
一元:Consumer
原始類型
作為參數:DoubleConsumer,IntConsumer,LongConsumer
二元:BiConsumer
原始類型
作為參數:ObjDoubleConsumer,ObjIntConsumer,ObjLongConsumer
Predicate類
一元:Predicate
原始類型
作為參數:DoublePredicate,IntPredicate,LongPredicate
二元:BiPredicate
Operator類
一元:UnaryOperator
原始類型
同時作為參數和返回值:DoubleUnaryOperator,IntUnaryOperator, LongUnaryOperator
二元:BinaryOperator
原始類型
同時作為參數和返回值:DoubleBinaryOperator,IntBinaryOperator,LongBinaryOperator
“額~彬哥,你這么把它們都列出來,搞得我更暈啦!”
別擔心,對于它們每一類、每一個接口到底是什么?怎么用?咱們后面的章節都會一一具體說明。這個分類,一來,可以幫助大家先有個大體上的認識;二來,也可以作為后面章節的一個大綱,同時方便大家搞忘的時候來查閱。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71743.html
摘要:相關接口簡介什么是接口,它代表這樣的一個函數,接受一個參數,然后返回一個結果。參數和返回值相互轉化的個作為參數的和個作為返回值的相互組合去掉重復的嗯,又到種接口,,,,,。 Function相關接口簡介 什么是Function接口? interface Function,它代表這樣的一個函數,接受一個參數,然后返回一個結果。 Function接口的functional方法 R app...
摘要:找工作之前看了很多面試題,復習資料,但是發現純看面試題是不行的,因為靠背的東西是記不牢的,需要知識成體系才可以,所以筆者整理了一份復習大綱,基本涵蓋了中高級工程師面試所必須知識點,希望可以通過此文幫助一些想換工作的朋友更好的復習,準備面試。 概述 都說金三銀四青銅五,這幾個月份是程序員最好的跳槽時間,筆者四月初也換了工作。找工作之前看了很多面試題,復習資料,但是發現純看面試題是不行的,因為靠...
摘要:淺析微信支付前篇大綱本文是淺析微信支付系列文章的第一篇,主要會介紹一下為何寫下這個系列以及對于微信支付的一點小經驗,與君共勉。下面講一下我是如何去學習微信支付的。 淺析微信支付:前篇大綱 本文是【淺析微信支付】系列文章的第一篇,主要會介紹一下為何寫下這個系列以及對于微信支付的一點小經驗,與君共勉。 以下會分幾個步驟講一下我學習微信支付的過程,也是一部辛酸史,也是希望朋友們不要再次跌進...
閱讀 2785·2021-10-14 09:42
閱讀 3608·2021-10-11 10:59
閱讀 2941·2019-08-30 11:25
閱讀 3073·2019-08-29 16:25
閱讀 3223·2019-08-26 17:40
閱讀 1224·2019-08-26 13:30
閱讀 1143·2019-08-26 11:46
閱讀 1329·2019-08-23 15:22