最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Kotlin 編程三分鐘入門

 更新時(shí)間:2017年05月20日 21:37:47   投稿:mdxy-dxy  
一個(gè)多月以來(lái)Kotlin從入門到現(xiàn)在,堅(jiān)持用來(lái)開(kāi)發(fā)的切身感受。因?yàn)檎Z(yǔ)法與Java的區(qū)別挺大的一開(kāi)始很想放棄,如果不是因?yàn)轫?xiàng)目在使用,想必很少人會(huì)嘗試這樣一門小眾語(yǔ)言,但是習(xí)慣后會(huì)發(fā)現(xiàn)這些年究竟浪費(fèi)多少時(shí)間在寫無(wú)用的Java代碼了

為什么使用Kotlin

項(xiàng)目一期在收尾了終于有時(shí)間折騰了,一個(gè)多月以來(lái)Kotlin從入門到現(xiàn)在,堅(jiān)持用來(lái)開(kāi)發(fā)的切身感受。因?yàn)檎Z(yǔ)法與Java的區(qū)別挺大的一開(kāi)始很想放棄,如果不是因?yàn)轫?xiàng)目在使用,想必很少人會(huì)嘗試這樣一門小眾語(yǔ)言,但是習(xí)慣后會(huì)發(fā)現(xiàn)這些年究竟浪費(fèi)多少時(shí)間在寫無(wú)用的Java代碼了,Kotlin在兼容Java的基礎(chǔ)上還能大大提升開(kāi)發(fā)效率。Kotlin有許多特性但對(duì)于開(kāi)發(fā)來(lái)說(shuō),快速適應(yīng)和學(xué)習(xí)更為重要,很多時(shí)候我們都是在不明白其原因就開(kāi)始使用的,正如我們不可能把Retrofit原理研究透才使用它。只要它足夠穩(wěn)定成熟,并能有效的提升開(kāi)發(fā)效率都是值得嘗試的。鄙人不才,目前使用Kotlin的原因主要是因?yàn)樗Z(yǔ)法簡(jiǎn)潔,支持lambda表達(dá)式,強(qiáng)大的when語(yǔ)法,不用寫分號(hào)結(jié)尾,光是這些就足以讓我喜歡Kotlin。至于空安全之類的特性,畢竟服務(wù)端數(shù)據(jù)類型太多null了并沒(méi)多大感觸,這些特性在實(shí)際應(yīng)用中潛移默化的就吸收了,以至于現(xiàn)在遇到幾個(gè)Java編寫的代碼,都有些不適應(yīng)了。

修改說(shuō)明

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

Kotlin 基本語(yǔ)法

先說(shuō)個(gè)學(xué)習(xí)Kotlin語(yǔ)法的小竅門,將代碼用Java寫好,然后Code/Conver Java File to Kotlin File轉(zhuǎn)換成Kotlin代碼,或者將Java代碼復(fù)制到Kotlin文件會(huì)提示轉(zhuǎn)換也是挺方便的,比較差異很容易就能理解了,一開(kāi)始難免不適應(yīng)習(xí)慣后相信你一定會(huì)喜歡上Kotlin

1). 定義

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

//常量數(shù)組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 正常使用,不過(guò)移除了switch用更強(qiáng)大的when替代,when子式可以是各種返回Boolean的表達(dá)式

val x = 7
when (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). 循環(huán)

while 和 do...while 同Java并無(wú)區(qū)別,for則有很大改變并多出了幾個(gè)變種

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])
}
//操作列表內(nèi)的對(duì)象
for (item in list) {
  print(item)
}
//加強(qiáng)版
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)
  }
})

萬(wàn)能的冒號(hào)

在Kotlin中冒號(hào):用萬(wàn)能來(lái)稱呼絕不為過(guò)。常量變量的類型聲明,函數(shù)的返回值,類的繼承都需要它

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

除此之外還有一個(gè)特別的地方也需要它,使用Java類的時(shí)候。Kotlin最終會(huì)還是編譯成Java字節(jié)碼,使用到Java類是必然的,在Kotlin語(yǔ)法如下

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

類名::class.java沒(méi)有為什么就這么寫記著就是

我是誰(shuí)的@

除了冒號(hào)另一個(gè)重要符號(hào)@,想必用到內(nèi)部類和匿名內(nèi)部類的地方一定很多,再加上支持lambda語(yǔ)法,沒(méi)有它誰(shuí)告訴你this和return指的是哪一個(gè)

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

偷懶的方法

1). Kotlin特色
Java的getter/setter方法自動(dòng)轉(zhuǎn)換成屬性,對(duì)應(yīng)到Kotlin屬性的調(diào)用

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;
  }
}

這樣一個(gè)Java類在Kotlin中只需這樣調(diào)用

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

反之Kotlin的屬性自動(dòng)生成Java的getter/setter方法,方便在Java中調(diào)用,同樣的定義在Kotlin中

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

我們的getter/setter方法有時(shí)不會(huì)這么簡(jiǎn)單,這就需要自定義getter/setter了,另起一行設(shè)置get()/set(value)方法,實(shí)現(xiàn)一個(gè)Java中常用的單例,這里只為了展示,單例在Kotlin有更簡(jiǎn)單的方法實(shí)現(xiàn),只要在 package 級(jí)別創(chuàng)建一個(gè) 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重點(diǎn)在field,跟我們熟悉所Java的this指代當(dāng)前類一樣,field指代當(dāng)前參數(shù),直接使用參數(shù)名instance代替不會(huì)報(bào)錯(cuò)但單例就沒(méi)效果了

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

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

3). lambda
一開(kāi)始覺(jué)得lambda很高級(jí)完全看不懂,其實(shí)很簡(jiǎn)單的就是把接口名、方法名和參數(shù)類型省掉不寫再加個(gè)->罷了,明白這點(diǎn)了就不介紹。

新面孔

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

空判斷

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

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

注意事項(xiàng)

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

以上僅是對(duì)使用頻率較高的語(yǔ)法總結(jié),學(xué)會(huì)基本可以閱讀Kotlin代碼,遇到點(diǎn)問(wèn)題Google速查一下,至于智能轉(zhuǎn)換、類型推導(dǎo)之類的不用說(shuō)使用后喜歡自然就會(huì)了。當(dāng)然這只是kotlin的基本語(yǔ)法,方便Java快速熟悉kotlin,深入學(xué)習(xí)還請(qǐng)閱讀相關(guān)資料。

相關(guān)文章

最新評(píng)論

安阳市| 崇仁县| 布尔津县| 禹州市| 云浮市| 沧州市| 获嘉县| 常熟市| 新蔡县| 洪江市| 永平县| 迭部县| 体育| 卓资县| 敦煌市| 鹤岗市| 古浪县| 禄丰县| 新野县| 友谊县| 会理县| 镇赉县| 格尔木市| 邓州市| 阜新市| 大方县| 伊宁市| 德安县| 长白| 桂阳县| 定结县| 郓城县| 乌审旗| 阳信县| 醴陵市| 万盛区| 望城县| 林周县| 庐江县| 长丰县| 平舆县|