Kotlin筆記 函數(shù)

Infix

Infix 函數(shù)是:

  • 如果函數(shù)是成員函數(shù)或者extension 函數(shù)
  • 如果只有一個(gè)參數(shù)
  • 標(biāo)注了infix
// Define extension to Int
infix fun Int.shl(x: Int): Int {
...
}

// call extension function using infix notation

1 shl 2

// is the same as

1.shl(2)

函數(shù)默認(rèn)值

fun read(b: Array<Byte>, off: Int = 0, len: Int = b.size()) {
  ...
}

如果子類要覆蓋父類的方法,函數(shù)聲明的時(shí)候需要沿用父類的默認(rèn)值肩祥,不能重寫默認(rèn)值

//open class A {
    open fun foo(i: Int = 10) { ... }
}

class B : A() {
    override fun foo(i: Int) { ... }  // no default value allowed
}

命名參數(shù)

fun reformat(str: String,
             normalizeCase: Boolean = true,
             upperCaseFirstLetter: Boolean = true,
             divideByCamelHumps: Boolean = false,
             wordSeparator: Char = ' ') {
...
}

reformat(str,
    normalizeCase = true,
    upperCaseFirstLetter = true,
    divideByCamelHumps = false,
    wordSeparator = '_'
)

Varargs

函數(shù)參數(shù)可以被標(biāo)記為vararg后室,參數(shù)會(huì)被當(dāng)做數(shù)組:

fun <T> asList(vararg ts: T): List<T> {
    val result = ArrayList<T>()
    for (t in ts) // ts is an Array
        result.add(t)
    return result
}

只有一個(gè)參數(shù)能被標(biāo)記為vararg,如果vararg參數(shù)不是最后一個(gè)參數(shù)搭幻,其他參數(shù)只能通過命名參數(shù)來傳遞咧擂。

局部函數(shù)

局部函數(shù)是定義在函數(shù)內(nèi)部的函數(shù)逞盆,它可以訪問外部函數(shù)的變量

fun dfs(graph: Graph) {
    fun dfs(current: Vertex, visited: Set<Vertex>) {
        if (!visited.add(current)) return
        for (v in current.neighbors)
            dfs(v, visited)
    }

    dfs(graph.vertices[0], HashSet())
}

泛型函數(shù)

泛型函數(shù)將泛型參數(shù)放在函數(shù)名之前

fun <T> singletonList(item: T): List<T> {
    // ...
}

Extension函數(shù)

向已有的對(duì)象添加函數(shù)檀蹋,函數(shù)里的this代表對(duì)象

fun MutableList<Int>.swap(index1: Int, index2: Int) {
    val tmp = this[index1] // 'this' corresponds to the list
    this[index1] = this[index2]
    this[index2] = tmp
}

高階函數(shù)

高階函數(shù)將其他函數(shù)作為參數(shù)傳入

fun <T> lock(lock: Lock, body: () -> T): T {
    lock.lock()
    try {
        return body()
    }
    finally {
        lock.unlock()
    }
}

如果最后一個(gè)參數(shù)是函數(shù),而且傳入的是lambda函數(shù)云芦,則可以把lambda函數(shù)寫在括號(hào)外俯逾,如果傳入的是匿名函數(shù),則不能寫在括號(hào)外:

lock (lock) {
    sharedResource.operation()
}

如果lambda函數(shù)只有一個(gè)參數(shù)舅逸,可以用it來指代

函數(shù)參數(shù)需要聲明函數(shù)的type:

fun <T> max(collection: Collection<T>, less: (T, T) -> Boolean): T? {
    var max: T? = null
    for (it in collection)
        if (max == null || less(max, it))
            max = it
    return max
}

函數(shù)類型里也可以指定參數(shù)名稱

val compare: (x: T, y: T) -> Int = ...

匿名函數(shù)

fun(x: Int, y: Int): Int = x + y

如果是單行的表達(dá)式桌肴,返回值的類型可以推導(dǎo)出,可以省略琉历,如果是block坠七,那么返回值的類型需要指定,否則就是Unit

lambda表達(dá)式的return是退出外圍的函數(shù)旗笔,而匿名函數(shù)的return是退出自己

閉包

lambda表達(dá)式和匿名函數(shù)都可以訪問外圍作用域的變量彪置,與Java不同的是,Kotlin允許修改閉包里的變量(Java閉包的變量需要聲明為final)

帶Receiver的字面函數(shù)(好難理解)

你可以定義一個(gè)函數(shù)蝇恶,指定這個(gè)函數(shù)的Receiver拳魁,Receiver為一個(gè)類

sum : Int.(other: Int) -> Int

然后在這個(gè)類的實(shí)例上調(diào)用這個(gè)函數(shù)

1.sum(2)

inline 函數(shù)

inline 之前

lock(l) { foo() }

inline 之后

inline fun lock<T>(lock: Lock, body: () -> T): T {
    // ...
}
==>
l.lock()
try {
    foo()
}
finally {
    l.unlock()
}

inline 會(huì)展開調(diào)用函數(shù)和lambda參數(shù),如果不想lambda參數(shù)被展開撮弧,可以在lambda參數(shù)前加上noinline

inline fun foo(inlined: () -> Unit, noinline notInlined: () -> Unit) {
    // ...
}

lambda表達(dá)式中不允許使用不帶標(biāo)簽的return語句(因?yàn)閘ambda中return是退出外圍的函數(shù)潘懊,這叫non-local return)姚糊,但如果lambda是傳入到一個(gè)inline函數(shù)中,則可以return

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末授舟,一起剝皮案震驚了整個(gè)濱河市救恨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌释树,老刑警劉巖忿薇,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異躏哩,居然都是意外死亡署浩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門扫尺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來筋栋,“玉大人,你說我怎么就攤上這事正驻”兹粒” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵姑曙,是天一觀的道長襟交。 經(jīng)常有香客問我,道長伤靠,這世上最難降的妖魔是什么捣域? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮宴合,結(jié)果婚禮上焕梅,老公的妹妹穿的比我還像新娘。我一直安慰自己卦洽,他們只是感情好贞言,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著阀蒂,像睡著了一般该窗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蚤霞,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天酗失,我揣著相機(jī)與錄音,去河邊找鬼争便。 笑死级零,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奏纪,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼鉴嗤,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了序调?” 一聲冷哼從身側(cè)響起醉锅,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎发绢,沒想到半個(gè)月后硬耍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡边酒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年经柴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墩朦。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡坯认,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氓涣,到底是詐尸還是另有隱情牛哺,我是刑警寧澤,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布劳吠,位于F島的核電站引润,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏痒玩。R本人自食惡果不足惜淳附,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望凰荚。 院中可真熱鬧燃观,春花似錦褒脯、人聲如沸便瑟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽到涂。三九已至,卻和暖如春颁督,著一層夾襖步出監(jiān)牢的瞬間践啄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國打工沉御, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留屿讽,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像伐谈,于是被迫代替她去往敵國和親烂完。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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