您好,登錄后才能下訂單哦!
Android Kotlin的使用及簡單實例
寫在前面的話,作為一個不熬夜的人,一覺醒來發(fā)現(xiàn)Kotlin成為了Android的官方語言,可謂是大喜過望。為了趁熱打鐵,我決定提前三天放出原定本周日Release的文章。希望能及時讓大家了解一下Kotlin。
相信很多開發(fā)人員,尤其是Android開發(fā)者都會或多或少聽說過Kotlin,當(dāng)然如果沒有聽過或者不熟悉也沒有關(guān)系。因為本篇文章以及博客后期的內(nèi)容會涉及到很多關(guān)于Kotlin的知識分享。
在寫這篇文章前的一個多月,F(xiàn)lipboard中國的Android項目確定了正式將Kotlin作為項目開發(fā)語言,這就意味著新增的代碼文件將以Kotlin代碼格式出現(xiàn),而且同時舊的Java代碼也將會陸陸續(xù)續(xù)翻譯成Kotlin代碼。在使用Kotlin的這段時間,被它的簡潔,高效,快捷等等特點(diǎn)震撼,所以有必要寫一篇文章來談一談Kotlin的特性,如若能取得推廣Kotlin的效果則倍感欣慰。
Kotlin的“簡歷”
來自知名的工具開發(fā)商JetBrains,也就決定了Kotlin的基因中必然包含實用與高效等特征。那我們接下來看一看Kotlin的特點(diǎn),當(dāng)然這也是我改用Kotlin的重要原因。
語法簡單,不啰嗦
//variables and constants var currentVersionCode = 1 //變量當(dāng)前的版本號,類型Int可以根據(jù)值推斷出來 var currentVersionName : String = "1.0" //顯式標(biāo)明類型 val APPNAME = "droidyue.com" //常量APPNAME 類型(String)可以根據(jù)值推斷出來 //methods fun main(args: Array<String>) { println(args) } // class class MainActivity : AppCompatActivity() { } // data class 自動生成getter,setting,hashcode和equals等方法 data class Book(var name: String, val price: Float, var author: String) //支持默認(rèn)參數(shù)值,減少方法重載 fun Context.showToast(message: String, duration:Int = Toast.LENGTH_LONG) { Toast.makeText(this, message, duration).show() }
空指針安全
空指針(NullPointerException或NPE)是我們使用Java開發(fā)程序中最常見的崩潰了。因為在Java中我們不得不寫很多防御性的代碼,比如這樣
public void test(String string) { if (string != null) { char[] chars = string.toCharArray(); if (chars.length > 10) { System.out.println(((Character)chars[10]).hashCode()); } } }
在Kotlin中空指針異常得到了很好的解決。
1.在類型上的處理,即在類型后面加上?,即表示這個變量或參數(shù)以及返回值可以為null,否則不允許為變量參數(shù)賦值為null或者返回null
2.對于一個可能是null的變量或者參數(shù),在調(diào)用對象方法或者屬性之前,需要加上?,否則編譯無法通過。
如下面的代碼就是Kotlin實現(xiàn)空指針安全的一個例子,而且相對Java實現(xiàn)而言,簡直是一行代碼搞定的。
fun testNullSafeOperator(string: String?) { System.out.println(string?.toCharArray()?.getOrNull(10)?.hashCode()) } testNullSafeOperator(null) testNullSafeOperator("12345678901") testNullSafeOperator("123") //result null 49 null
關(guān)于空指針安全的原理,可以參考這篇文章研究學(xué)習(xí)Kotlin的一些方法
支持方法擴(kuò)展
很多時候,F(xiàn)ramework提供給我們的API往往都時比較原子的,調(diào)用時需要我們進(jìn)行組合處理,因為就會產(chǎn)生了一些Util類,一個簡單的例子,我們想要更快捷的展示Toast信息,在Java中我們可以這樣做。
public static void longToast(Context context, String message) { Toast.makeText(context, message, Toast.LENGTH_LONG).show(); }
但是Kotlin的實現(xiàn)卻讓人驚奇,我們只需要重寫擴(kuò)展方法就可以了,比如這個longToast方法擴(kuò)展到所有的Context對象中,如果不去追根溯源,可能無法區(qū)分是Framework提供的還是自行擴(kuò)展的。
fun Context.longToast(message: String) { Toast.makeText(this, message, Toast.LENGTH_LONG).show() } applicationContext.longToast("hello world")
注意:Kotlin的方法擴(kuò)展并不是真正修改了對應(yīng)的類文件,而是在編譯器和IDE方面做得處理。使我們看起來像是擴(kuò)展了方法。
Lambda, 高階函數(shù),Streams API, 函數(shù)式編程支持
所謂的Lambda表達(dá)式是匿名函數(shù),這使得我們的代碼會更加的簡單。比如下面的代碼就是lambda的應(yīng)用。
findViewById(R.id.content).setOnClickListener { Log.d("MainActivity", "$it was clicked") }
所謂的高階函數(shù)就是
舉一個接受函數(shù)作為參數(shù)的例子。在Android開發(fā)中,我們經(jīng)常使用SharedPreference來存儲數(shù)據(jù),如果忘記調(diào)用apply或者commit則數(shù)據(jù)修改不能應(yīng)用。利用Kotlin中的高階函數(shù)的功能,我們能更好的解決這個問題
fun SharedPreferences.editor(f: (SharedPreferences.Editor) -> Unit) { val editor = edit() f(editor) editor.apply() } //實際調(diào)用 PreferenceManager.getDefaultSharedPreferences(this).editor { it.putBoolean("installed", true) }
當(dāng)然這上面的例子中我們也同時使用了方法擴(kuò)展這個特性。
Kotlin支持了Streams API和方法引用,這樣函數(shù)式編程更加方便。比如下面的代碼就是我們結(jié)合Jsoup,來抓取某個proxy網(wǎng)站的數(shù)據(jù),代碼更加簡單,實現(xiàn)起來也快速。
fun parse(url: String): Unit { Jsoup.parse(URL(url), PARSE_URL_TIMEOUT).getElementsByClass("table table-sm") .first().children() .filter { "tbody".equals(it.tagName().toLowerCase()) } .flatMap(Element::children).forEach { trElement -> ProxyItem().apply { trElement.children().forEachIndexed { index, element -> when (index) { 0 -> { host = element.text().split(":")[0] port = element.text().split(":")[1].toInt() } 1 -> protocol = element.text() 5 -> country = element.text() } } }.let(::println) } }
字符串模板
無論是Java還是Android開發(fā),我們都會用到字符串拼接,比如進(jìn)行日志輸出等等。在Kotlin中,字符串模板是支持的,我們可以很輕松的完成一個字符串?dāng)?shù)組的組成
val book = Book("Thinking In Java", 59.0f, "Unknown") val extraValue = "extra" Log.d("MainActivity", "book.name = ${book.name}; book.price=${book.price};extraValue=$extraValue")
注意:關(guān)于字符串拼接可以參考這篇文章Java細(xì)節(jié):字符串的拼接
與Java交互性好
Kotlin和Java都屬于基于JVM的編程語言。Kotlin和Java的交互性很好,可以說是無縫連接。這表現(xiàn)在
Kotlin應(yīng)用廣泛
Kotlin對Android應(yīng)用開發(fā)支持廣泛,諸多工具,比如kotterknife(ButterKnife Kotlin版),RxKotlin,Anko等等,當(dāng)然還有已經(jīng)存在的很多Java的庫都是可以使用的。
除此之外,Kotlin也可以編譯成JavaScript。最近使用Kotlin寫了一段抓取proxy的代碼,實現(xiàn)起來非常快捷。甚至比純JavaScript實現(xiàn)起來要快很多。
fun handle(): Unit { window.onload = { document.getElementsByClassName("table table-sm").asList().first() .children.asList().filter { "TBODY".equals(it.tagName.toUpperCase()) } .flatMap { it.children.asList() }.forEach { var proxyItem = ProxyItem() it.children.asList().forEachIndexed { index, element -> when (index) { 0 -> { proxyItem.host = element.trimedTextContent()?.split(":")?.get(0) ?: "" proxyItem.port = element.trimedTextContent()?.split(":")?.get(1)?.trim()?.toInt() ?: -1 } 1 -> proxyItem.protocol = element.trimedTextContent() ?: "" 5 -> proxyItem.country = element.trimedTextContent() ?: "" } }.run { console.info("proxyItem $proxyItem") } } } }
關(guān)于性能
Kotlin的執(zhí)行效率和Java代碼的執(zhí)行效率理論上一致的。有時候Kotlin可能會顯得高一些,比如Kotlin提供了方法的inline設(shè)置,可以設(shè)置某些高頻方法進(jìn)行inline操作,減少了運(yùn)行時的進(jìn)棧出棧和保存狀態(tài)的開銷。
讀到這里,是不是想要嘗試一下Kotlin呢,它簡潔的語法,匯集諸多特性,高效率實現(xiàn)等等,已經(jīng)在國外風(fēng)生水起,國外的Pintereset, Square, Flipboard等公司已經(jīng)開始應(yīng)用到生產(chǎn)中。
關(guān)于轉(zhuǎn)向Kotlin
其實,我在做決定之前(當(dāng)時Kotlin還沒有被欽定)也曾有過考慮,是不是選擇了Kotlin就意味著放棄Java呢,冷靜下來想一想,其實并不是那么回事,因為Kotlin與Java語法太相近,以及在Kotlin中無時無刻不在和Java相關(guān)的東西打交道,所以這點(diǎn)顧慮不是問題的。
對于個人的項目來轉(zhuǎn)向Kotlin,通常不是很難的選擇,畢竟Kotlin是那么優(yōu)秀的語言,相信很多人還是愿意嘗試并使用這個事半功倍的語言的。
而比較難抉擇的情況是如果如何讓團(tuán)隊轉(zhuǎn)用Kotlin,個人認(rèn)為團(tuán)隊難以轉(zhuǎn)用的原因有很多,比如學(xué)習(xí)成本,歷史包袱等等。但其實根本原因還是思維方式的問題,歪果仁喜歡用工具來提升開發(fā)效率,因為人力成本很高。而國內(nèi)團(tuán)隊提高效率的辦法通常是增加成員。好在Flipboard 美國團(tuán)隊自2015年(可能更早)就引入了Kotlin,因此中國團(tuán)隊這邊選用Kotlin也更加順?biāo)浦邸.?dāng)然更主要的是目前團(tuán)隊規(guī)模不大,成員一致認(rèn)可Kotlin的優(yōu)點(diǎn)。
關(guān)于團(tuán)隊轉(zhuǎn)用Kotlin的方法,一般比較行得通的辦法是自上而下的推行。這就意味著要么直接的技術(shù)負(fù)責(zé)人比較開明要么就是需要有人來不斷推介來影響團(tuán)隊。
做個比較現(xiàn)實的比擬,Java就像是一趟從我的家鄉(xiāng)保定開往北京西的耗時將近2個小時甚至更長的普通列車,而Kotlin則是那趟僅需40分鐘就能到達(dá)的高鐵。通常的人都會選擇高鐵,因為它節(jié)省了時間和提高了體驗。這個時間和體驗對應(yīng)編程中的,我想應(yīng)該是高效率和高可讀性,可維護(hù)性的代碼。
現(xiàn)在好了,有了Google的支持,Kotlin轉(zhuǎn)Android相信在不久的將來就會全面展開。篡改Python的一句名言“人生苦短,我用Kotlin”,這樣一個高效實用的語言應(yīng)該會被越來越多的團(tuán)隊所接受,并應(yīng)用到開發(fā)生產(chǎn)中。當(dāng)然也希望在國內(nèi)環(huán)境下大放異彩。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。