Kotlin 初步介紹-語法

Kotlin 也是把代碼編譯成 .class 文件,Java 也是這樣,所以 Android 前幾年支持Kotlin,今天就初步介紹一些基本的語法。

定義常量與變量
var <標識符> : <類型> = <初始化值>   // var 是關鍵字,意思是可變的
val <標識符> : <類型> = <初始化值>   // val 是關鍵字,意思是不可變的,相當於Java中聲明對象時,使用了 final

舉個例子,上面是 kotlin 寫法,下面是 Java 寫法

var a: Int = 1
var b: String = "hello"
val a1: Int = 2
val b1: String = "world"

int aa = 1;
String bb = "hello";
final int aa1 = 2;
final String bb1 = "world";

以上就是對比,發現點什麼沒?kotlin中不需要以分號結尾,java中則是必須的。kotlin中聲明對象,類型是可以省略的,比如可以 var a = 1,這種屬於類型推導。Kotlin 中數字的加減和Java中的一些操作符用法是相同的,比如說 +,+=,-,-=,*,/,%等等;它裏面打印的方法是 println();對於字符串,我們可以打印一個 hello world,

fun main(args: Array<String>) {
    val s = "hello world"
    println(s)
}

這裏的 main 方法,就相當於是 Java 中的 main 方法,上面只是直觀的打印了 s 的值,如果我們相擁字符串把 s 包裹一下,同時帶你 s 的值呢,或者說給 s 拼接上一個字符串 "I am back" 怎麼辦?Java 中直接用 + 把兩個字符串拼接起來就行,Kotlin 中也可以用 + 來實現,還可以通過在字符串中使用 $ 來實現

fun main(args: Array<String>) {
    var s = "hello world"
    var ss = " I am back "
    s+=ss
    println(s)
}

fun main(args: Array<String>) {
    var s = "hello world"
    var ss = " I am back "
    println("$s$ss")
}

字符串中 $ 相當於引用對象,注意 println("$s$ss") 方法中的寫法,兩個對象是用字符包裹的,並且是緊挨在一起的,如果中間有空隙,則拼接的s和ss中間也有間隙。$ 的用法更多是在我們的一串文字中,要引用某個字符串對象,這時候就比較方便了,

fun main(args: Array<String>) {
    var s = "hello world"
    var ss = "I am back"
    val s1 = "I like $s and $ss"
    println(s1)
}

如果想在s1中的字符ss後面拼接一個 _2 怎麼辦,直接在 $ss 後面寫會報錯,這時候使用{}來解決,{}代表一個整體

fun main(args: Array<String>) {
    var s = "hello world"
    var ss = "I am back"

    val s1 = "I like $s and ${ss}_2"
    println(s1)
}


對於方法,比如說求兩個數據的和,先用java語言寫一個

    private int sum(int a, int b) {
        return a + b;
    }

下面使用 kotlin 寫一個

    fun sum(a: Int, b: Int): Int {
        return a + b
    }

kotlin 的方法中,它的參數類型是寫在形參的後面,並且中間用冒號隔開,同時在方法的後面有個冒號和 Int ,它代表的是返回的類型,方法前面使用 fun 來修飾,其實上面的寫法可以簡化,把返回的類型和return等省去,

    fun sum(a: Int, b: Int) = a + b

上面默認的就是 private 修飾方法,如果此方法是 public 修飾的,則冒號和 Int 標識類型的代碼,不能省略

    public fun sum(a: Int, b: Int): Int = a + b

我們java方法中,有個可變參數的概念,那麼用kotlin怎麼實現呢

    fun printVars(vararg ar: Int) {
        for (i in ar) {
            print(i)
        }
    }

    private void  printVars(int... ar) {
        for (int i : ar){
            System.out.println(i);
        }
    }

如果我們調用 printVars(1, 2, 3, 4, 5),則打印出 12345,這裏 vararg 就相當於是java中的 ... 這個符號,for循環中使用 in 來標識,那麼打印1到9怎麼表示?

    fun printNum() {
        for (i in 1..9) {
            print(i)
        }
    }

for 循環中使用了 in 這個關鍵字, 1到9 用的是 .. 來表示,如果想打印從a到b之間的數,則

    fun printFor(a: Int, b: Int) {
        for (i in a..b) {
            println(i)
        }
    }

忽然想起剛學java時打印的乘法口訣了,此時用 kotlin 來寫,則

    fun multipForm(){
        for(i in 1..9){
            for (j in 1..9){
                if(j < i + 1){
                    print(" $i * $j = ${i*j}\t")
                }
            }
            println()
        }
    }


\t 表示一個標準的空格符,打印出來的效果爲

 1 * 1 = 1    
 2 * 1 = 2     2 * 2 = 4    
 3 * 1 = 3     3 * 2 = 6     3 * 3 = 9    
 4 * 1 = 4     4 * 2 = 8     4 * 3 = 12     4 * 4 = 16    
 5 * 1 = 5     5 * 2 = 10     5 * 3 = 15     5 * 4 = 20     5 * 5 = 25    
 6 * 1 = 6     6 * 2 = 12     6 * 3 = 18     6 * 4 = 24     6 * 5 = 30     6 * 6 = 36    
 7 * 1 = 7     7 * 2 = 14     7 * 3 = 21     7 * 4 = 28     7 * 5 = 35     7 * 6 = 42     7 * 7 = 49    
 8 * 1 = 8     8 * 2 = 16     8 * 3 = 24     8 * 4 = 32     8 * 5 = 40     8 * 6 = 48     8 * 7 = 56     8 * 8 = 64    
 9 * 1 = 9     9 * 2 = 18     9 * 3 = 27     9 * 4 = 36     9 * 5 = 45     9 * 6 = 54     9 * 7 = 63     9 * 8 = 72     9 * 9 = 81    
 


kotlin 的一大優勢就是減少了大量的對象非空判斷,比如定義一個對象 address,如果直接使用 = ,則表示不能爲null;如果想讓初始化的值爲null,則在初始化賦值時,使用 ?= 來表示,意思允許爲null;比如說我們打印一個字符串的長度

    fun printLength() {
        var address = "China"
        var length = address.length
        println(length)
    }

如果我們使用了 ?= 來初始化值,獲取 length 時編譯器會提示錯誤,使用 !!. 來表示,它的意思是你確定此時 address 不爲null再使用,出問題了你自己負責

    fun printLength() {
        var address: String? = "China"
        var length = address!!.length
        println(length)
    }

也就是說,我肯定這裏 address 不爲null,可以使用 !!. 來調用長度的方法;如果我們不能保證 address 不爲null怎麼辦?用 ?. 來修飾,它表示一旦爲null,不會拋異常,會返回一個 null ,

    fun printLength() {
        var address: String? = null
        var length = address?.length
        println(length)
    }

接下來重點來了,比如說上面的 length ,如果 address 不爲null,則取它的長度;如果爲null,則取一個默認值2,怎麼辦?這時候 ?: 閃亮登場

    fun printLength() {
        var address: String? = null
        var length = address?.length ?: 2
        println(length)
    }

上面的代碼是個縮影,獲取嵌套對象屬性時爲了避免大量的非空判斷,可以把 ?. 和 ?: 配合使用來完成要做的功能,常用的一個地方就是持久化保存屬性值的時候 CacheUtils.putBoolean(context, key, value); 使用來保存boolean 值對象的,此時 value 需要從一個封裝好的對象中獲取,加入說 A 對象中有個屬性 B 對象,B 對象中有個boolean屬性 isOn,取值時,不論是 A 還是 B 爲null時value默認值使用 false,怎麼獲取value呢? value = A?.B?.isOn?:false 即可,省去了java中一堆的判斷。


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章