Kotlin方法與Lambda表達式實踐使用介紹
前言
經(jīng)過前面對 Kotlin 的介紹,相信大家已經(jīng)能對 Kotlin 有了一個基本的認識。 從這節(jié)開始,我就為大家講解 Kotlin的方法以及Lambda表達式等高級操作。
一、Kotlin的方法
1、方法聲明
fun functionLearn(days: Int): Boolean { return days > 100 }
成員方法
//成員方法 class Person { fun test1() { println("成員方法") } } Person().test1()
類方法
Kotlin 中并沒有 static 關(guān)鍵字,不過我們可以借助 companion object 來實現(xiàn) 類方法的目的。
(1)companion object 實現(xiàn)的類方法
class Person { companion object { fun test2() { println("companion object 實現(xiàn)的類方法") } } } Person.test2()
(2)靜態(tài)類
如果我們想實現(xiàn)一個工具 util 的話,可以借助 object 來創(chuàng)建一個靜態(tài)類:
/** * 整個靜態(tài)類 */ object NumUtil { fun double(num: Int): Int { return num * 2 } }
(3)全局靜態(tài)
我們可以直接新建一個 Kotlin file 然后定義一些常量、方法。
單表達式方法
當方法返回單個表達式時,可以省略花括號并且在 = 符號之后指定代碼體即可:
fun double(x: Int): Int = x * 2
當返回值類型可由編譯器推斷時,顯式聲明返回類型是可選的:
fun double(x: Int) = x *
2、方法參數(shù)
默認參數(shù)
方法參數(shù)可以有默認值,當省略相應的參數(shù)時使用默認值。與其 Java 相比, 這可以減少重載數(shù)量:
fun read(b: Array<Byte>, off: Int = 0, len: Int = b.size) { /*……*/ }
我們可以通過類型后面的 = 來設(shè)置默認值。
如果一個默認參數(shù)在一個無默認值的參數(shù)之前,那么該默認值只能通過使用 具名參數(shù)調(diào)用該方法 來使用:
fun foo(bar: Int = 0, baz: Int) { /*……*/ } foo(baz = 1) // 使用默認值 bar = 0
如果在默認參數(shù)之后的最后一個參數(shù)是 lambda 表達式,那么它既可以作為 具名參數(shù)在括號內(nèi)傳 入,也可以在括號外傳入:
fun foo(bar: Int = 0, baz: Int = 1, qux: () -> Unit) { /*……*/ } foo(1) { println("hello") } // 使用默認值 baz = 1 foo(qux = { println("hello") }) // 使用兩個默認值 bar = 0 與 baz = 1 foo { println("hello") } // 使用兩個默認值 bar = 0 與 baz = 1
可變數(shù)量的參數(shù)
方法的參數(shù)(通常是最后一個)可以用 vararg 修飾符標記:
fun append(vararg str: Char): String { val result = StringBuffer() for (char in str) { result.append(char) } return result.toString() }
允許將可變數(shù)量的參數(shù)傳遞給方法:
append('h', 'e', 'l', 'l', 'o')
可變參數(shù)的要求:
• 只有一個參數(shù)可以標注為 vararg;
• 如果 vararg 參數(shù)不是列表中的最后一個參數(shù), 可以使用具名參數(shù)語 法傳遞其后的參數(shù)的 值,或者,如果參數(shù)具有方法類型,則通過在括 號外部傳一個 lambda。
當我們調(diào)用 vararg 方法時,我們可以一個接一個地傳參,例如 append('h', 'e', 'l', 'l', 'o'),或者,如果我們已經(jīng)有一個數(shù)組并希望將其內(nèi)容傳給該方法, 我們使用伸展(spread)操作符(在數(shù)組前面加 *):
val world = charArrayOf('w', 'o', 'r', 'l', 'd') val result = append('h', 'e', 'l', 'l', 'o',' ', *world)
3、方法作用域
在 Kotlin 中方法可以在文件頂層聲明,這意味著你不需要像一些語言如 Java、C# 那樣需要創(chuàng)建一個類來保存一個方法。 此外除了頂層方法, Kotlin 中方法也可以聲明在局部作用域、作為成員方法以及擴展方法。
局部方法
Kotlin 支持局部方法,即一個方法在另一個方法內(nèi)部:
fun magic(): Int { fun foo(v: Int): Int { return v * v } val v1 = (0..100).random() return foo(v1) }
局部方法可以訪問外部方法(即閉包)的局部變量。
二、Lambda表達式
在 Java 8 的時候開始支持 Lambda 表達式,目前 Lambda 語法在 Java 中已 經(jīng)被廣泛的運用,Lambda 表達式可以理解為是一種語法糖,值得慶幸的 是,Kotlin 一經(jīng)開源成熟就已經(jīng)支持這種語法。
Lambda 表達式的本質(zhì)其實是匿名方法,因為在其底層實現(xiàn)中還是通過匿名 方法來實現(xiàn)的。但是我們在用的時候不必關(guān)心起底層實現(xiàn)。不過 Lambda 的 出現(xiàn)確實是減少了代碼量的編寫,同時也是代碼變得更加簡潔明了。
Lambda 作為方法式編程的基礎(chǔ),其語法也是相當簡單的。這里先通過一段 簡單的代碼演示沒讓大家了解 Lambda 表達式的簡潔之處:
view.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(v.getContext(), "Lambda 簡潔之道", Toast.LENGTH_LONG).show(); } });
VS
view.setOnClickListener { v -> Toast.makeText(v.context, "Lambda 簡潔之道 ", Toast.LENGTH_LONG).show() }
1、Lambda表達式的特點
語法如下:
無參數(shù)的情況 :
val/var 變量名 = { 操作的代碼 }
有參數(shù)的情況:
val/var 變量名 : (參數(shù)的類型,參數(shù)類型,...) -> 返回值類型 = {參數(shù) 1,參數(shù)
2,... -> 操作參數(shù)的代碼 }
可等價于
// 此種寫法:即表達式的返回值類型會根據(jù)操作的代碼自推導出來。
val/var 變量名 = { 參數(shù) 1 : 類型,參數(shù) 2 : 類型, ... -> 操作參數(shù)的代碼 }
lambda 表達式作為方法中的參數(shù)的時候,這里舉一個例子:
fun test(a : Int, 參數(shù)名 : (參數(shù) 1 : 類型,參數(shù) 2 : 類型, ... ) -> 表達式返回
類型){
...
}
2、Lambda實踐
如何使用 it
認識 it
• it 并不是 Kotlin 中的一個關(guān)鍵字(保留字)
• it 是在當一個高階方法中 Lambda 表達式的參數(shù)只有一個的時候可以使用 it 來使 用此參數(shù)
• it 可表示為單個參數(shù)的隱式名稱,是 Kotlin 語言約定的
• 實例 A:單個參數(shù)的隱式名稱
// 這里舉例一個語言自帶的一個高階方法 filter,此方法的作用是過濾掉不滿足條 件的值。 val arr = arrayOf(1,3,5,7,9) // 過濾掉數(shù)組中元素小于 2 的元素,取其第一個打印。這里的 it 就表示每一個元 素。 println(arr.filter { it < 5 }.component1()) //結(jié)合上文的 testClosure(1)(2) { println(it) }
如何使用下劃線_
在使用 Lambda 表達式的時候,可以用下劃線(_)表示未使用的參數(shù),表示不 處理這個參數(shù)。
在遍歷一個 Map 集合的時候,這當非常有用
val map = mapOf("key1" to "value1", "key2" to "value2", "key3" to "value3") map.forEach { (key, value) -> println("$key \t $value") } // 不需要 key 的時候 map.forEach { (_, value) -> println(value) }
總結(jié)
本文僅僅簡單介紹了pandas的使用,而pandas提供了大量能使我們快速便捷地處理數(shù)據(jù)的函數(shù)和方法。
到此這篇關(guān)于Kotlin方法與Lambda表達式實踐使用介紹的文章就介紹到這了,更多相關(guān)Kotlin方法與Lambda表達內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
利用百度地圖Android sdk高仿微信發(fā)送位置功能及遇到的問題
這篇文章給大家介紹了利用百度地圖Android sdk高仿微信發(fā)送位置功能,在實現(xiàn)此功能的時候遇到點小問題,下面小編給大家列出來,需要的朋友參考下吧2017-12-12實例講解Android中ContentProvider組件的使用方法
這篇文章主要介紹了Android中ContentProvider組件的使用方法,包括ContentProvider使用單元測試的步驟,需要的朋友可以參考下2016-04-04Flutter利用Hero組件實現(xiàn)自定義路徑效果的動畫
本篇介紹了如何利用Hero動畫組件的createRectTween屬性實現(xiàn)自定義路徑效果的動畫。文中的示例代碼講解詳細,感興趣的可以了解一下2022-06-06Android 自定義TextView去除paddingTop和paddingBottom
這篇文章主要介紹了Android 自定義TextView去除paddingTop和paddingBottom的相關(guān)資料,這里提供實例來幫助大家實現(xiàn)這樣的功能,需要的朋友可以參考下2017-09-09Retrofit Rxjava實現(xiàn)圖片下載、保存并展示實例
本篇文章主要介紹了Retrofit Rxjava實現(xiàn)圖片下載、保存并展示實例,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06Android開發(fā)中優(yōu)秀的app 異常處理機制
這篇文章主要介紹了Android開發(fā)中優(yōu)秀的app 異常處理機制 的相關(guān)資料,需要的朋友可以參考下2015-12-12