lambda表達式,稱為匿名函數,是一種函數字面值,也就是沒有聲明的函數,但可以作為表達式傳遞出去.
函數類型:
對於接受另一個函數的作為自己的參數,必須針對這個參數指定一個函數的類型如
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 }
參數less的類型(T,T)->Boolean ,也就是說,它是一個函數,接受二個T類型的參數,並且返回一個Boolean類型的結果
lambda表達式語法
val sun = { x: Int, y: Int -> x + y }
表達式包含在大括號之內,在完整的語法形式中,參數聲明在小括號中,參數類型可選,函數體在->符合之后,如果lambda表達式自動推斷的返回值類型不是Unit,那么在lambda表達式函數體中,最后一條表達式的值會被當做整個lambda表達式的返回值
匿名函數
ints.filter(fun(item)=item >0)
對於匿名函數,返回值類型的自動推斷方式與通常函數的一樣,如果函數體是一個表達式,那么返回值類型可以推斷得到,如果函數體是多條語句組成的代碼段,則返回值類型必須明確指定
注意:匿名函數參數一定在小括號內傳遞,允許將函數參數寫在小括號之外的語法,僅對lambda表達式有效.
閉包
var sum = 0 ints.filrter(it>0).forEach( sum+=it ) print(sum)
lambda表達式匿名函數可以訪問它的閉包,也就是定義在外層范圍的變量.,