国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

function包概述及大綱

garfileo / 2941人閱讀

摘要:但這里為了解釋上面的問題,彬哥還是得多啰嗦幾句。這個方法誰能告訴我這是什么鬼彬哥現在也不知道,這還真不是彬哥故意賣關子。但是,方法的參數和返回值是需要我們關心和注意的。

大家有沒有發現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.ConsumerConsumer是個Functional接口,有且只有一個“抽象方法”--void accept(T t)。這個accept方法誰能告訴我這?是什么鬼?彬哥現在也不知道,這還真不是彬哥故意賣關子。這是因為啊,你可以function包下的接口都是“無意義的”,這個“無意義”并不是說它們沒有存在的意義,而是說它們都必須放到具體的語境中去才會真正的意義。或者說,它們是“非典型”的Java API就體現在,它們自己是沒有語境(Context)的,它們實際上可以說就是為Lambda表達式而存在的--你不需要了解他叫什么(匿名的),它們是作為參數在對象的方法的中傳遞的。

它們沒有自己的結構,只定義行為,這很不OOP,但很FP(Functional Programming),所以你可以說,從JDK 8開始,函數也可以被稱作Java世界中的“第一公民”了。

來看個具體的例子,java.lang.IterableforEach方法:

default void forEach(Consumer action) {
    Objects.requireNonNull(action);
    for (T t : this) {
        action.accept(t);
    }
}

它的參數就是個Consumer,從forEach這個方法的定義來看,現在我們可以理解到“遍歷我所包含的所有元素,對每個元素都執行一次action.accept()”,還有點抽象?不過已經有些好理解了是吧?咱們再進一步看:

List list = new ArrayList<>();
list.add("Hello ");
list.add("彬哥!");
list.forEach(s -> System.out.println(s)); // 這里當然也可以用更為簡潔的方法引用來改寫

現在在具體的語境里來理解就很容易了,“對于list中的每一個元素,執行我傳進去的那個函數--Consumer”。可能咱們每天都在用類似的寫法,但可能從來都沒有意識到,那原來就是個Consumer啊。這不怪大家,因為“它們都是無意義的”,就像在這里,你根本不需要知道我們其實最后是調用的了Consumeraccept方法。
其實啊,所有java.util.function包下的接口的方法名,我們都不必關心,因為當我們用它們的時候,壓根不會去顯式地調用它們,方法名也是“無意義”的,它們只是方便大家去理解他的用途。但是,方法的參數和返回值是需要我們關心和注意的。

function包下總共有43個接口,嗯~看上去數量還是不少。不必害怕,其實滿打滿算也就這么5類:
FunctionSupplierConsumerPredicateOperator。這么看就很少了吧。這還不只,它們還有很多相似的地方,咱們再根據這些相似點分類、舉一反三,就會簡單很多。這里先按照這些共性的點,給這43個接口細分下歸類:

Function類

一元:Function

原始類型

作為參數:DoubleFunctionIntFunctionLongFunction

作為返回值:ToDoubleFunctionToIntFunctionToLongFunction

相互轉化:DoubleToIntFunctionDoubleToLongFunctionIntToDoubleFunctionIntToLongFunctionLongToDoubleFunctionLongToIntFunction

二元:BiFunction

原始類型

作為返回值:ToDoubleBiFunctionToIntBiFunctionToLongBiFunction

Supplier類

一元:Supplier

原始類型

作為返回值:BooleanSupplierDoubleSupplierIntSupplierLongSupplier

Consumer類

一元:Consumer

原始類型

作為參數:DoubleConsumerIntConsumerLongConsumer

二元:BiConsumer

原始類型

作為參數:ObjDoubleConsumerObjIntConsumerObjLongConsumer

Predicate類

一元:Predicate

原始類型

作為參數:DoublePredicateIntPredicateLongPredicate

二元:BiPredicate

Operator類

一元:UnaryOperator

原始類型

同時作為參數和返回值:DoubleUnaryOperatorIntUnaryOperatorLongUnaryOperator

二元:BinaryOperator

原始類型

同時作為參數和返回值:DoubleBinaryOperatorIntBinaryOperatorLongBinaryOperator

“額~彬哥,你這么把它們都列出來,搞得我更暈啦!”
別擔心,對于它們每一類、每一個接口到底是什么?怎么用?咱們后面的章節都會一一具體說明。這個分類,一來,可以幫助大家先有個大體上的認識;二來,也可以作為后面章節的一個大綱,同時方便大家搞忘的時候來查閱。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/71743.html

相關文章

  • Function相關接口簡介

    摘要:相關接口簡介什么是接口,它代表這樣的一個函數,接受一個參數,然后返回一個結果。參數和返回值相互轉化的個作為參數的和個作為返回值的相互組合去掉重復的嗯,又到種接口,,,,,。 Function相關接口簡介 什么是Function接口? interface Function,它代表這樣的一個函數,接受一個參數,然后返回一個結果。 Function接口的functional方法 R app...

    gotham 評論0 收藏0
  • 史上最全 Android 中高級工程師面試復習大綱

    摘要:找工作之前看了很多面試題,復習資料,但是發現純看面試題是不行的,因為靠背的東西是記不牢的,需要知識成體系才可以,所以筆者整理了一份復習大綱,基本涵蓋了中高級工程師面試所必須知識點,希望可以通過此文幫助一些想換工作的朋友更好的復習,準備面試。 概述 都說金三銀四青銅五,這幾個月份是程序員最好的跳槽時間,筆者四月初也換了工作。找工作之前看了很多面試題,復習資料,但是發現純看面試題是不行的,因為靠...

    chengjianhua 評論0 收藏0
  • 淺析微信支付:前篇大綱

    摘要:淺析微信支付前篇大綱本文是淺析微信支付系列文章的第一篇,主要會介紹一下為何寫下這個系列以及對于微信支付的一點小經驗,與君共勉。下面講一下我是如何去學習微信支付的。 淺析微信支付:前篇大綱 本文是【淺析微信支付】系列文章的第一篇,主要會介紹一下為何寫下這個系列以及對于微信支付的一點小經驗,與君共勉。 以下會分幾個步驟講一下我學習微信支付的過程,也是一部辛酸史,也是希望朋友們不要再次跌進...

    mayaohua 評論0 收藏0

發表評論

0條評論

garfileo

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<