成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

function包概述及大綱

garfileo / 3006人閱讀

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

大家有沒有發(fā)現(xiàn)java.util.function包(本文后面簡稱function包)下的接口雖然比較多(目前共43個(gè)),但都是定義很簡單的(方法很少),而我們理解起來卻十分的困難。其實(shí)啊,這也不怪大家,是因?yàn)檫@個(gè)包下的接口并不是典型的Java的API,你可以說它們是“異類”。那么問題來了,典型的Java API是什么樣子的呢?function包下的接口又“異”在哪里?

總所周知,Java是一種典型的OOP面向?qū)ο缶幊?/b>)語言,封裝、繼承、多態(tài)自不必多說,大家想必都十分清楚了。但這里為了解釋上面的問題,彬哥還是得多啰嗦幾句。面向?qū)ο笠粋€(gè)很重要的標(biāo)識就是,把結(jié)構(gòu)和行為封裝到一個(gè)類(對象)中。

典型的Java API就是這樣子的,舉個(gè)大家都很熟悉的例子:java.util.List。List是一個(gè)接口,是接口就只有方法,沒有屬性。但是,咱們來看看的List中的方法:size()、isEmpty()、contains(Object o)等等,按照正常人的思維,很容易、也很自然會將這些方法理解成:“假設(shè)我是個(gè)List的對象(實(shí)例)話,你們調(diào)用我的size()方法,我會將我的size告訴你;調(diào)用我的isEmpty()方法,我會告訴你我是不是空的;調(diào)用我的contains()方法,我會告訴你我是不是包含了你指定的這個(gè)對象”。大家有沒有發(fā)現(xiàn)點(diǎn)什么?所有這些方法,很自然的加入到“我”這個(gè)語境(context)中去了。

那么再來看看這個(gè)咱們這個(gè)專題的主角function包看,找個(gè)典型代表出來:java.util.function.Consumer。Consumer是個(gè)Functional接口,有且只有一個(gè)“抽象方法”--void accept(T t)。這個(gè)accept方法誰能告訴我這?是什么鬼?彬哥現(xiàn)在也不知道,這還真不是彬哥故意賣關(guān)子。這是因?yàn)榘?,你可?b>function包下的接口都是“無意義的”,這個(gè)“無意義”并不是說它們沒有存在的意義,而是說它們都必須放到具體的語境中去才會真正的意義。或者說,它們是“非典型”的Java API就體現(xiàn)在,它們自己是沒有語境(Context)的,它們實(shí)際上可以說就是為Lambda表達(dá)式而存在的--你不需要了解他叫什么(匿名的),它們是作為參數(shù)在對象的方法的中傳遞的。

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

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

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

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

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

現(xiàn)在在具體的語境里來理解就很容易了,“對于list中的每一個(gè)元素,執(zhí)行我傳進(jìn)去的那個(gè)函數(shù)--Consumer”??赡茉蹅兠刻於荚谟妙愃频膶懛ǎ赡軓膩矶紱]有意識到,那原來就是個(gè)Consumer啊。這不怪大家,因?yàn)椤八鼈兌际菬o意義的”,就像在這里,你根本不需要知道我們其實(shí)最后是調(diào)用的了Consumeraccept方法。
其實(shí)啊,所有java.util.function包下的接口的方法名,我們都不必關(guān)心,因?yàn)楫?dāng)我們用它們的時(shí)候,壓根不會去顯式地調(diào)用它們,方法名也是“無意義”的,它們只是方便大家去理解他的用途。但是,方法的參數(shù)和返回值是需要我們關(guān)心和注意的。

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

Function類

一元:Function

原始類型

作為參數(shù):DoubleFunction,IntFunction,LongFunction

作為返回值:ToDoubleFunctionToIntFunction,ToLongFunction

相互轉(zhuǎn)化:DoubleToIntFunction,DoubleToLongFunctionIntToDoubleFunction,IntToLongFunction,LongToDoubleFunction,LongToIntFunction

二元:BiFunction

原始類型

作為返回值:ToDoubleBiFunction,ToIntBiFunction,ToLongBiFunction

Supplier類

一元:Supplier

原始類型

作為返回值:BooleanSupplier,DoubleSupplierIntSupplierLongSupplier

Consumer類

一元:Consumer

原始類型

作為參數(shù):DoubleConsumer,IntConsumer,LongConsumer

二元:BiConsumer

原始類型

作為參數(shù):ObjDoubleConsumerObjIntConsumer,ObjLongConsumer

Predicate類

一元:Predicate

原始類型

作為參數(shù):DoublePredicate,IntPredicate,LongPredicate

二元:BiPredicate

Operator類

一元:UnaryOperator

原始類型

同時(shí)作為參數(shù)和返回值:DoubleUnaryOperator,IntUnaryOperator, LongUnaryOperator

二元:BinaryOperator

原始類型

同時(shí)作為參數(shù)和返回值:DoubleBinaryOperator,IntBinaryOperator,LongBinaryOperator

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

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/71743.html

相關(guān)文章

  • Function相關(guān)接口簡介

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

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

    摘要:找工作之前看了很多面試題,復(fù)習(xí)資料,但是發(fā)現(xiàn)純看面試題是不行的,因?yàn)榭勘车臇|西是記不牢的,需要知識成體系才可以,所以筆者整理了一份復(fù)習(xí)大綱,基本涵蓋了中高級工程師面試所必須知識點(diǎn),希望可以通過此文幫助一些想換工作的朋友更好的復(fù)習(xí),準(zhǔn)備面試。 概述 都說金三銀四青銅五,這幾個(gè)月份是程序員最好的跳槽時(shí)間,筆者四月初也換了工作。找工作之前看了很多面試題,復(fù)習(xí)資料,但是發(fā)現(xiàn)純看面試題是不行的,因?yàn)榭?..

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

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

    mayaohua 評論0 收藏0
  • 怎樣給一個(gè)Vue頁面添加大綱導(dǎo)航

    摘要:這里用到一個(gè)非常重要的函數(shù),它會根據(jù)調(diào)用的根節(jié)點(diǎn)遍歷該節(jié)點(diǎn)的子樹,返回符合某個(gè)選擇器的一個(gè)類數(shù)組的對象,但不是數(shù)組,而且遍歷方式就是上文所述的深度優(yōu)先先序遍歷真是激動人心接下來我們可以用這個(gè)元素獲取所有需要導(dǎo)航的元素列表。 一、前言 前兩天項(xiàng)目遇到一個(gè)需要給頁面添加大綱導(dǎo)航的功能,要求把頁面中的特定標(biāo)簽加入到大綱導(dǎo)航中。類似這樣: showImg(https://segmentfaul...

    susheng 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<