国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Kotlin 編程三分鐘入門

2019-10-23 18:28:27
字體:
來源:轉載
供稿:網友

為什么使用Kotlin

項目一期在收尾了終于有時間折騰了,一個多月以來Kotlin從入門到現在,堅持用來開發的切身感受。因為語法與Java的區別挺大的一開始很想放棄,如果不是因為項目在使用,想必很少人會嘗試這樣一門小眾語言,但是習慣后會發現這些年究竟浪費多少時間在寫無用的Java代碼了,Kotlin在兼容Java的基礎上還能大大提升開發效率。Kotlin有許多特性但對于開發來說,快速適應和學習更為重要,很多時候我們都是在不明白其原因就開始使用的,正如我們不可能把Retrofit原理研究透才使用它。只要它足夠穩定成熟,并能有效的提升開發效率都是值得嘗試的。鄙人不才,目前使用Kotlin的原因主要是因為它語法簡潔,支持lambda表達式,強大的when語法,不用寫分號結尾,光是這些就足以讓我喜歡Kotlin。至于空安全之類的特性,畢竟服務端數據類型太多null了并沒多大感觸,這些特性在實際應用中潛移默化的就吸收了,以至于現在遇到幾個Java編寫的代碼,都有些不適應了。

修改說明

突然火了一臉懵逼,Google IO的影響真是不容小覷。避免誤人子弟還是修改下比較好,也就把上一篇文章的基礎知識也搬遷過來,移除過期鏈接。

Kotlin 基本語法

先說個學習Kotlin語法的小竅門,將代碼用Java寫好,然后Code/Conver Java File to Kotlin File轉換成Kotlin代碼,或者將Java代碼復制到Kotlin文件會提示轉換也是挺方便的,比較差異很容易就能理解了,一開始難免不適應習慣后相信你一定會喜歡上Kotlin

1). 定義

忘掉Java的那一套寫法不然會很不適應的,Kotlin有自己的特性不該被Java的思維所束縛。在Kotlin中常量用val聲明,變了用var聲明,關鍵字在前面,類型以冒號:隔開在后面,也可以省略直接賦值,類型后帶問號?表示可為空類型(默認空安全)。
常量val延遲加載by lazy{},默認線程安全關閉線程安全lazy(LazyThreadSafetyMode.NONE){},變量var延遲加載lateinit。

//常量數組int[][][] arrs = new int[3][2][1];val arrs = Array(3) { Array(2) { IntArray(1) } }//空安全變量var str: String = "hello"//可為空字符串變量var str1: String? = null

2). 條件

if...else 正常使用,不過移除了switch用更強大的when替代,when子式可以是各種返回Boolean的表達式

val x = 7when (x) { in 1..10 -> print("x is in the range") in validNumbers -> print("x is valid") !in 10..20 -> print("x is outside the range") else -> print("none of the above")}

3). 循環

while 和 do...while 同Java并無區別,for則有很大改變并多出了幾個變種

val list = ArrayList<String>()//遞增for (int i = 0; i < list.size(); i++)for (i in list.indices) {  print(list[i])}//遞增for (int i = 2; i < list.size(); i++)for (i in 2..list.size-1) {  print(list[i])}//遞減for (int i = list.size(); i >= 0; i--)for (i in list.size downTo 0) {  print(list[i])}//操作列表內的對象for (item in list) {  print(item)}//加強版for((i, item) in list.witnIndex()) {  print(list[i])  print(item)}//變種版list.forEach {  print(it)}list.forEach {  print(it)}list.forEachIndexed { i, s ->  print(list[i])  print(s)}list.forEachIndexed(object :(Int,String) -> Unit{  override fun invoke(i: Int, s: String) {    print(list[i])    print(s)  }})

萬能的冒號

在Kotlin中冒號:用萬能來稱呼絕不為過。常量變量的類型聲明,函數的返回值,類的繼承都需要它

//val表示常量var表示變量聲明val name: String = "tutu" //省略類型說明var age = "23"//fun表示函數fun getName(): String{  return "tutu"}//類繼承class UserList<E>(): ArrayList<E>() {  //...}

除此之外還有一個特別的地方也需要它,使用Java類的時候。Kotlin最終會還是編譯成Java字節碼,使用到Java類是必然的,在Kotlin語法如下

val intent = Intent(this, MainActivity::class.java)

類名::class.java沒有為什么就這么寫記著就是

我是誰的@

除了冒號另一個重要符號@,想必用到內部類和匿名內部類的地方一定很多,再加上支持lambda語法,沒有它誰告訴你this和return指的是哪一個

class User {  inner class State{    fun getUser(): User{      //返回User      return this@User    }    fun getState(): State{      //返回State      return this@State    }  }}

偷懶的方法

1). Kotlin特色
Java的getter/setter方法自動轉換成屬性,對應到Kotlin屬性的調用

public class User {  private String name;  private String age;  public String getName() {    return name;  }  public void setName(String name) {    this.name = name;  }  public String getAge() {    return age;  }  public void setAge(String age) {    this.age = age;  }}

這樣一個Java類在Kotlin中只需這樣調用

val user = User()//賦值user.name = "tutu"user.age = "23"//取值val name = user.nameval age = user.age

反之Kotlin的屬性自動生成Java的getter/setter方法,方便在Java中調用,同樣的定義在Kotlin中

class User {  var name: String? = null  var age: String? = null}

我們的getter/setter方法有時不會這么簡單,這就需要自定義getter/setter了,另起一行設置get()/set(value)方法,實現一個Java中常用的單例,這里只為了展示,單例在Kotlin有更簡單的方法實現,只要在 package 級別創建一個 object 即可

class User {  companion object {    @Volatile var instance: User? = null      get() {        if (field == null) {          synchronized(User::class.java) {            if (field == null)              field = User()          }        }        return field      }  }  var name: String? = null  var age: String? = null}

自定義getter/setter重點在field,跟我們熟悉所Java的this指代當前類一樣,field指代當前參數,直接使用參數名instance代替不會報錯但單例就沒效果了

2). 字符串模板
在Java中拼接字符串的代碼可讀性都很差,在Kotlin字符串拼接變得非常簡潔,只需用$后面加上參數名,復雜的參數要加上{}

val user = User()//賦值user.name = "tutu"user.age = "23"//取值val name = user.nameval age = user.agevar userInfo = "name:${user.name}, age:$age"//輸出結果:name:tutu, age:23

3). lambda
一開始覺得lambda很高級完全看不懂,其實很簡單的就是把接口名、方法名和參數類型省掉不寫再加個->罷了,明白這點了就不介紹。

新面孔

1). 延遲加載
2). 流程控制

空判斷

Kotlin的空安全設計對于聲明可為空的參數,在使用時要進行空判斷處理,有兩種處理方式一種像Java一樣拋出空異常,字段后加!!,另一種不做處理直接跳過,字段后加?

//類型后面加?表示可為空var age: String? = "23" //拋出空指針異常val ageInt = age!!.toInt()//不做處理跳過val ages = age?.toInt()

注意事項

內部類和參數默認為public,而在Java中為private
類默認為不可繼承(final),想要可被繼承要聲明為open或abstract
取消了static關鍵字,靜態方法和參數統一寫在companion object塊
internal模塊內可見,inner內部類

以上僅是對使用頻率較高的語法總結,學會基本可以閱讀Kotlin代碼,遇到點問題Google速查一下,至于智能轉換、類型推導之類的不用說使用后喜歡自然就會了。當然這只是kotlin的基本語法,方便Java快速熟悉kotlin,深入學習還請閱讀相關資料。

 

注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 韶关市| 南召县| 九龙坡区| 松桃| 太仓市| 和静县| 吐鲁番市| 上犹县| 海伦市| 丰都县| 噶尔县| 土默特右旗| 奎屯市| 平邑县| 普定县| 林口县| 大丰市| 安化县| 兰西县| 镇远县| 剑川县| 嘉荫县| 三门峡市| 漳平市| 屯昌县| 班玛县| 汪清县| 衡南县| 大荔县| 吐鲁番市| 辉县市| 博爱县| 昆山市| 岳普湖县| 乌什县| 恩平市| 买车| 浏阳市| 乾安县| 安福县| 饶阳县|