Kotlin筆記高階函式(七)

2021-10-25 06:20:07 字數 3981 閱讀 9409

kotlin筆記資料型別(一)

kotlin筆記字串(二)

kotlin筆記運算子(三)

kotlin筆記函式(四)

kotlin筆記物件導向(五)

kotlin筆記繼承、抽象類、介面(六)

二、lambda表示式

三、閉包與捕獲變數

四、內聯函式

乙個函式可以作為另乙個函式的引數,或者返回值,那麼這個函式就是「高階函式」

kotlin中每乙個函式都有乙個型別,稱為「函式型別」,函式型別作為一種資料型別與數

據型別在使用場景沒有區別

//定義計算長方形面積函式

//函式型別(double, double) -> double

fun rectanglearea

(width: double, height: double)

: double

//定義計算三角形面積函式

//函式型別(double, double) -> double

fun ********area

(bottom: double, height: double)

=0.5

* bottom * height ②

fun sayhello()

fun main

(args: array

)

函式型別可以宣告的變數,那麼函式型別變數能夠接收什麼的資料呢?即函式字面量如何

表示的問題,函式字面量可以有三種表示:

fun calculate

(opr: char)

:(int, int)

-> int

//減法函式

fun sub

(a: int, b: int)

: int

val result:

(int, int)

-> int =

when (opr)

}else

->

//除法lambda表示式 ④

}return result

}fun main

(args: array

)

fun main

(args: array

)fun getfunwithtype

(type:int)

:(int,int)

->int

}return functiontype

}

fun main

(args: array

)fun operterfun

(funname:

(int,int)

->int,a: int,b: int)

:int

fun getfunwithtype

(type:int)

:(int,int)

->int

}return functiontype

}

lambda表示式的引數列表與函式的引數列表形式類似,但是lambda表示式引數列

表前後沒有小括號。箭頭符號將引數列表與lambda體分隔開,lambda表示式不需要宣告

返回型別。lambda表示式可以有返回值,如果沒有return語句lambda體的最後乙個表

達式就是lambda表示式的返回值,如果有return語句返回值是return語句後面的表達

式。

fun main

(args: array

)println

(funla(2

,4))

}

可以簡化成

尾隨lambda 如果乙個函式的最後乙個引數是lambda表示式,那麼這個lambda表達

式可以放在函式括號之後。

fun main

(args: array))

//尾隨寫法

operterfun(2

,3)}

fun operterfun

(a: int,b: int,funname:

(int,int)

->int)

:int

如果lambda表示式的引數只有乙個,並且能夠根據上下文環境推導出它的資料類

型,那麼這個引數宣告可以省略,在lambda體中使用隱式引數it替代lambda表達

式的引數

fun main

(args: array)}

fun operterla

(name:string,funname:

(string)

->unit)

lambda表示式體中也可以使用return語句,它會使程式跳出lambda表示式體

fun main

(args: array

)//呼叫lambda表示式add

println

(add()

)//10

}//累加求和函式

fun sum

(vararg num: int)

: int

return total

}

閉包(closure)是一種特殊的函式,它可以訪問函式體之外的變數,這個變數和函式一

同存在,即使已經離開了它的原始作用域也不例外。這種特殊函式一般是區域性函式、匿名

函式或lambda表示式

fun makearray()

:(int)

-> int

return

::add ⑥

}fun main

(args: array

)

在高階函式中引數如果是函式型別,則可以接收lambda表示式,而lambda表示式在編譯

時被編譯稱為乙個匿名類,每次呼叫函式時都會建立乙個物件,如果這種被函式反覆呼叫

則建立很多物件,會帶來執行時額外開銷。為了解決次問題,在kotlin中可以將這種函式

宣告為內聯函式。

提示 內聯函式在編譯時不會生成函式呼叫**,而是用函式體中實際**替換每次

呼叫函式

使用關鍵字 inline

inline fun calculateprint

(funn:

(int, int)

-> int)")

}fun main

(args: array) ②

calculateprint ③

}

在kotlin中乙個函式引數被宣告為非空型別時,也可以接收可空型別的引數,但是如果實

際引數如果真的為空,可能會導致比較嚴重的問題。因此需要在引數傳遞之前判斷可空參

數是否為非空

fun main

(args: array

)fun saynamelength

(name:string?

) name?

.let

}

fun main

(args: array

) var stringbuilder3=

with

(name)

println

(name)

println

(stringbuilder2)

println

(stringbuilder3)

## hello world

## my name is zyb

## hello world

## my name is zyb

## 我是with

}

kotlin高階函式

val list list listof 1,3,4,9 1.使用傳統的方式條件元素 var newlist arraylist list foreach it為list元素 2.使用map來進行元素操作返回乙個新的list val newlist list map it為list裡面的元素 3.m...

Kotlin高階函式講解

fun main args array string 輸出結果 faltlist.foreach println 輸出求list裡面的總和 println faltlist.reduce 呼叫下面求階乘的方法0到6的階乘 0.6 map factorial foreach println 得到階乘以...

Kotlin高階函式概念

一 高階函式的基本概念 1.傳入或者返回函式的函式 傳入是函式,返回也是函式 2.函式引用最常見的方式,println 3.帶有接收者receiver的引用pdfprinter println 二 看一下入門的例子 package net.println.kotlin.chapter5.basics...