有關(guān)kotlin

有關(guān)kotlin

kotlin的簡介

kotlin是一個基于JVM的新的編程語言,與Java相比,Kotlin的語法更簡潔、更具表達(dá)性,而且提供了更多的特性,比如,高階函數(shù)、操作符重載、字符串模板。它與Java高度可互操作,可以同時用在一個項(xiàng)目中。官網(wǎng)上的總結(jié):

  • 簡潔 :減少樣板代碼是數(shù)量
  • 安全 :避免空指針
  • 通用:可構(gòu)建服務(wù)器,Android應(yīng)用,前端程序
  • 互操作性:與java 100%互操作
  • 工具化:隨意選擇編譯方式

kotlin的優(yōu)勢

1.線程切換

java:handler不僅寫法繁瑣 而且容易引起內(nèi)存泄漏


image.png

kotlin:


image.png

2.getter setter

java :

 public class Person{
     private int id;
     private String name;
     //瞅啥瞅,省略掉的是 getter 和 setter!
     ...
 }

kotlin:

data class Person(val id: Int, val name: String)

3.空指針

java中常需要如下判空:

 if(x != null) x.y();
 Person person = findPersonFromCacheOrCreate();
 if(person!=null)
 person.setName("橘右京");

kotlin:String 表示一個不可為 null 的字符串類型,如果返回null代碼即會報(bào)錯

  fun findPersonFromCacheOrCreate(): String{
     ...
 }

String 已經(jīng)確定是不會為空,一定有值;而 String?則是未知的,也許有值,也許是空。在使用對象的屬性和方法的時候,String 類型的對象可以毫無顧忌的直接使用,而 String?類型需要你先做非空判斷。

  fun demo() {
    val string1: String = "string1"
    val string2: String? = null
    val string3: String? = "string3"

    println(string1.length)    //7
    println(string2?.length)   //null 不會報(bào)空 注意string2后面的"?",等于判空如果不加編輯器會提醒報(bào)錯    
    println(string3?.length)   //7
}

盡管 string2 是一個空對象,也并沒有因?yàn)槲艺{(diào)用了它的屬性/方法就報(bào)空指針。而你所需要做的,僅僅是加一個"?"(等于判空)。

4.Smart Cast

java:不夠聰明,不建議強(qiáng)轉(zhuǎn)但有些情況不可避免

 if(view instanceof ViewGroup){
     ((ViewGroup) view).addView(child);
 }

kotlin:

 if(view is ViewGroup){
     view.addView(child) // 現(xiàn)在 Kotlin 已經(jīng)知道 view 是 ViewGroup 類型了!
 }

5.方法可擴(kuò)展

判別是否為空字符串:
java:

 public class StringUtils{
     public static boolean notEmpty(String str){
         return !"".equals(str);
     }
     public static boolean isEmpty(String str){
         return "".equals(str);
     }
 }

kotlin:添加String的拓展方法

fun String.isEmpty():boolean{
     return this=="";
}

6.替代butterknife

7.SharedPreferences 持久化

如同讀寫內(nèi)存一樣簡單直接:

 var name by Preference(context, "name", "橘右京", "sp_name")
 ...
 Log.d(TAG, name) // 第一次讀取,只能讀取到默認(rèn)值,那就是 橘右京
 name = "不知火舞"
 Log.d(TAG, name) // 這里輸出的就是 不知火舞 啦

8.一個關(guān)鍵字實(shí)現(xiàn)單例

object Log {
    fun i(string: String) {
        println(string)
    }
}

fun main(args: Array<String>) {
    Log.i("test")
}

問題

1.需要理解函數(shù)式編程,學(xué)習(xí)成本相對較高
2.代碼混淆時需注意一些坑
3.Android library 不建議使用kotlin 會有額外的大小以及編譯異常的問題

總結(jié)

根據(jù)項(xiàng)目實(shí)際情況考慮引入kotlin的可行性,可以由淺入深,比如先從JavaBean入手 。以上內(nèi)容可能不太全面,感興趣的可以在以下參考資料中繼續(xù)了解。

參考資料

帖子:
http://www.lxweimin.com/p/8a1fce6fa93a
https://zhuanlan.zhihu.com/p/24900005
文檔:
https://github.com/huanglizhuo/kotlin-in-chinese
項(xiàng)目:
https://github.com/githubwing/GankClient-Kotlin
https://github.com/antoniolg/Bandhook-Kotlin

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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