Kotlin(1.1)學(xué)習(xí)筆記(9)——函數(shù)

kotlin中函數(shù)的使用和聲明與java中大部分都是相同的慌闭,本文只針對(duì)某幾個(gè)點(diǎn)作出一些自己的理解电抚。

類外聲明函數(shù)

不同于java函數(shù)依賴于class,kotlin中的函數(shù)在編譯過(guò)程中依賴的是package,所以可以將函數(shù)聲明在class外,減少了一些輔助性函數(shù)與class的耦合镊叁。

class A{
    //...
}
fun outClass(){//這樣做的方式是完全合法的
   //....
}

命名參數(shù)

java中我們常常見到public void X(param1,param2,param3...paramN){}這種參數(shù)很多的函數(shù)尘颓,寫起來(lái)比較麻煩走触,kotlin中使用命名參數(shù)可以有效的減少代碼量

 fun nameParamsTest(str: String,
                       booleanValue: Boolean = false,
                       intValue: Int = 1,
                       doubleValue: Double = 1.0){
        //do nothing
        LogUtils.v(TAG,"$str  boolean = $booleanValue    int = $intValue     double = $doubleValue")
    }

如上聲明的函數(shù)在聲明時(shí)使用了默認(rèn)值,在使用中如果不需要改變默認(rèn)值則可以用下面的方式進(jìn)行調(diào)用

nameParamsTest("aaa",doubleValue = 2.0)//aaa  boolean = false    int = 1     double = 2.0
nameParamsTest("bbb",intValue = 2)//bbb  boolean = false    int = 2     double = 1.0

可變數(shù)量參數(shù) vararg

使用vararg關(guān)鍵字修飾的參數(shù)疤苹,可以將其看為是一個(gè)可變長(zhǎng)度的數(shù)組互广。它修飾的參數(shù)最好放在參數(shù)列表的最后,如果把它后面還有其他參數(shù)卧土,則需要使用命名參數(shù)的語(yǔ)法對(duì)后面的參數(shù)進(jìn)行傳遞惫皱,如下:

 /**
     * 可變數(shù)量的參數(shù)
     * @param list
     * @param values 這里的values可以看做是一個(gè)數(shù)組即 values: Array<out T>,
     *     一般來(lái)說(shuō)尤莺,arrarg傳遞可變數(shù)量參數(shù)應(yīng)放置在參數(shù)列表的最后旅敷,
     *     如果不是的話,它之后的參數(shù)應(yīng)該用命名參數(shù)的方式進(jìn)行傳遞,具體參見 [appendList2]
     */
    fun <T> appendList(list: MutableList<T>, vararg values: T): List<T>{
        list += values
        for (i in list.indices){
            LogUtils.v(TAG,"i = ${list[i]}")
        }
        return list
    }

    fun <T> appendList2(vararg values: T,list: MutableList<T>): List<T>{
        list += values
        for (i in list.indices){
            LogUtils.v(TAG,"i = ${list[i]}")
        }
        return list
    }

調(diào)用時(shí)

  appendList(ArrayList<Int>(),1,2,3,4)
  appendList2(5,6,7,8,list = ArrayList<Int>())//如果這里把list=去掉颤霎,則無(wú)法通過(guò)編譯

在給vararg修改時(shí)的參數(shù)傳參時(shí)媳谁,我們可以用*Array將數(shù)組中的數(shù)據(jù)當(dāng)做參數(shù)傳遞涂滴,而不是傳遞數(shù)組對(duì)象。

val array = intArrayOf(1, 2, 3)
appendList(ArrayList<Int>(),*array )

尾遞歸 tailrec

如果函數(shù)的最后一個(gè)操作是它本身晴音,我們可以將一個(gè)for循環(huán)改寫為類遞歸的方式柔纵,避免指針越界。這就是尾遞歸锤躁。尾遞歸函數(shù)在聲明時(shí)需要使用關(guān)鍵字tailrec 搁料,注意如果最后一個(gè)操作是放置在try-catch模塊中,我們不能保證最后一個(gè)操作能夠順利進(jìn)行系羞,所以不能使用尾遞歸簡(jiǎn)寫代碼郭计。如下,我們將taiRec2()可以改寫為tailRec()

    /**
     * 尾遞歸
     * 如果函數(shù)將其自身調(diào)用作為最后一個(gè)操作時(shí)椒振,可以使用如下的方式拣宏,將一個(gè)for循環(huán)改寫為一個(gè)類似遞歸的寫法
     * 因?yàn)檫@個(gè)特性,他不能放在try-catch模塊中
     * 它的功能和[taiRec2]是一致的
     */
    tailrec fun taiRec(x: Double = 1.0): Double
            = if (x == Math.cos(x)) x else taiRec(Math.cos(x))

    private fun taiRec2(): Double {
        var x = 1.0
        while (true) {
            val y = Math.cos(x)
            if (x == y) return y
            x = y
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末杠人,一起剝皮案震驚了整個(gè)濱河市勋乾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌嗡善,老刑警劉巖辑莫,帶你破解...
    沈念sama閱讀 222,464評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異罩引,居然都是意外死亡各吨,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門袁铐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)揭蜒,“玉大人,你說(shuō)我怎么就攤上這事剔桨√敫” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵洒缀,是天一觀的道長(zhǎng)瑰谜。 經(jīng)常有香客問(wèn)我,道長(zhǎng)树绩,這世上最難降的妖魔是什么萨脑? 我笑而不...
    開封第一講書人閱讀 59,979評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮饺饭,結(jié)果婚禮上渤早,老公的妹妹穿的比我還像新娘。我一直安慰自己瘫俊,他們只是感情好鹊杖,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評(píng)論 6 398
  • 文/花漫 我一把揭開白布提鸟。 她就那樣靜靜地躺著,像睡著了一般仅淑。 火紅的嫁衣襯著肌膚如雪称勋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,584評(píng)論 1 312
  • 那天涯竟,我揣著相機(jī)與錄音赡鲜,去河邊找鬼。 笑死庐船,一個(gè)胖子當(dāng)著我的面吹牛银酬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播筐钟,決...
    沈念sama閱讀 41,085評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼揩瞪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了篓冲?” 一聲冷哼從身側(cè)響起李破,我...
    開封第一講書人閱讀 40,023評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎壹将,沒想到半個(gè)月后嗤攻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡诽俯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評(píng)論 3 342
  • 正文 我和宋清朗相戀三年妇菱,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片暴区。...
    茶點(diǎn)故事閱讀 40,769評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡闯团,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仙粱,到底是詐尸還是另有隱情房交,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評(píng)論 5 351
  • 正文 年R本政府宣布缰盏,位于F島的核電站涌萤,受9級(jí)特大地震影響淹遵,放射性物質(zhì)發(fā)生泄漏口猜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評(píng)論 3 335
  • 文/蒙蒙 一透揣、第九天 我趴在偏房一處隱蔽的房頂上張望济炎。 院中可真熱鬧,春花似錦辐真、人聲如沸须尚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)耐床。三九已至密幔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撩轰,已是汗流浹背胯甩。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堪嫂,地道東北人偎箫。 一個(gè)月前我還...
    沈念sama閱讀 49,191評(píng)論 3 378
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像皆串,于是被迫代替她去往敵國(guó)和親淹办。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容