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