天天看點

Kotlin學習之起始篇—基礎文法

Kotlin學習之起始篇—基礎文法

Kotlin被Android接納為官方語言已經一年多了,現在才開始學習,實在慚愧。希望能一點點進步,到最後能完全用Kotlin開發app。廢話就不多說了。Let’s get started!

1. 定義包

package my.demo
import java.util.*
// ...
           

包名要放在源檔案的開頭位置,好像和Java沒什麼差別,除了末尾不用分号

結束。這是

Kotlin

Java

的一大不同點,語句結束不用加分号

2. 定義函數

2.1 有參,有傳回值函數

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

傳入兩個Int類型參數,傳回Int數值。函數名前面要添加關鍵字

fun

。參數類型及傳回值類型的定義方式和Java大不相同。

像這樣的函數體隻有一句表達式,傳回值類型可自動推斷的函數,可以簡寫如下:

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

2.2 有參,無傳回值函數

fun printSum(a: Int, b: Int): Unit {
    println("sum of $a and $b is ${a + b}")
}
           

其中的關鍵字

Unit

類似于Java裡面的

void

關鍵字。可以了解為傳回一個無意義的值或者說無傳回值。無傳回值的函數還可以簡寫如下:

fun printSum(a: Int, b: Int) {
    println("sum of $a and $b is ${a + b}")
}
           

3. 定義變量

3.1 聲明變量

var a: Int = 
var b = 
           

聲明一個變量時必須使用

var

關鍵字,然後定義類型,也可以不定義,不定義的話系統會自動推斷它的類型,這是和Java變量聲明最不同的地方,Java的變量必須聲明類型。

3.2 隻讀變量(常量)

用關鍵字

val

來定義一個隻讀變量,變量一旦初始化之後,不可再次指派。類似于Java中使用

final

關鍵字定義一個常量。

4. 代碼注釋

和Java是一樣的

// 單行注釋

/*  代碼塊
    多行注釋 */
           

5. 使用字元串模闆

var a = 
// 簡單模闆:
val s1 = "a is $a" 

a = 
// 複雜一點的:
val s2 = "${s1.replace("is", "was")}, but now is $a"
           

使用一個美元符号

$

+ 變量名,就能引用該變量的值,别忘了外面要加雙引号。甚至在引用的時候還能對值進行操作,需要注意,這種操作并不會改變原變量(上面代碼裡的

s1

)的值。

6. 使用條件表達式

if語句:

fun maxOf(a: Int, b: Int): Int {
    if (a > b) {
        return a
    } else {
        return b
    }
}
           

一個擷取最大值的方法,看起來和Java的寫法一樣啊,哈哈哈。其實它還能簡寫:

fun maxOf(a: Int, b: Int) = if (a > b) a else b
           

一行代碼就寫好了,這就是傳說中的

文法糖

吧。用熟練了,寫起來确實輕松。

7. 使用可空值,進行null檢查

var a: String = "323"
  var b: String? = "dfd"
           

使用問号

?

,表明該變量b為可空,而變量a一定不能為空,如果在使用過程中給變量a賦

null

值,将會自動報錯,是以可以放心地操作a,比如

a.length

一定不會出現

NullPointException

。 而如果調用

b.length

則将會報錯,因為變量b有可能為空。如果一定要調用可以使用安全調用符

?.

代替

.

, 比如

b?.length

,那麼當b為

null

時,這個方法将傳回

null

,而不是出現

NullPointException

關于安全調用符

?.

, 比如我們有一個對象

Person

,裡面有一個對象參數

school

,對象School裡有字元串變量

schoolName

, 現在我們要知道這個人所在學校的名稱。那麼使用通常方式是:

Person.school.schoolName

,但是如果對象

person

null

或者

school

null

,這種調用将會出現

NullPointException

,如果使用安全調用符:

Person?.school?.schoolName

,隻要其中某個對象為空,結果将傳回

null

,而不是直接報錯。

fun printProduct(arg1: String, arg2: String) {
    //将字元轉換為數字,如果轉換失敗将傳回null
    val x = arg1.toIntOrNull()
    val y = arg2.toIntOrNull()
    if (x != null && y != null) {
        //計算x和y的乘積
        println(x * y)
    } else {
        //列印資訊,提示某個參數無法轉換
        println("either '$arg1' or '$arg2' is not a number")
    }
}
           

上面這種null檢查和Java裡的寫法差不多,進行操作之前先檢查是否為null

擷取一個字元串的長度,如果為空,傳回-1

val l: Int = if (b != null) b.length() else -
           

另一種簡略寫法:有點像Java裡面的三目運算,如果不為空,傳回b的長度,否則傳回-1

8. 類型檢查和自動轉換

fun getStringLength(obj: Any): Int?{
      return if(obj is String) obj.length else null
  }
           

使用

is

操作符判斷參數的類型,類似于Java 裡面的

instanceof

操作符,判斷之後,可以直接調用其對應類的方法,相當于做了類型轉換。上面的

Any

類型類似于Java的

Object

類型,是所有類的父類。

9. 使用for循環

val items = listOf("apple", "banana", "kiwifruit")
for (item in items) {
    println(item)
}
           

Java裡面使用冒号

:

作循環操作符, 而Kotlin使用

in

。另一種Kotlin寫法如下:

val items = listOf("apple", "banana", "kiwifruit")
for (index in items.indices) {
    println("item at $index is ${items[index]}")
}
           

通過

list

index

來循環

10. 使用while循環

val items = listOf("apple", "banana", "kiwifruit")
var index = 
while (index < items.size) {
    println("item at $index is ${items[index]}")
    index++
}
           

和Java一樣。。

11. 使用when表達式

fun describe(obj: Any): String =
    when (obj) {
         -> "One"
        "Hello" -> "Greeting"
        is Long -> "Long"
        !is String -> "Not a string"
        else -> "Unknown"
}
           

類似于Java中的

Switch

表達式,但

when

功能更強大,它能夠使用表達式作為分支條件。可以使用

when

來替代

if - else if

表達式

12. 使用ranges

val x = 
val y = 
if (x in .y+) {
    println("fits in range")
}
           

使用關鍵字

in

檢查數值是否在某個範圍内。

val list = listOf("a", "b", "c")
if (- !in .list.lastIndex) {
    println("-1 is out of range")
}
if (list.size !in list.indices) {
    println("list size is out of valid list indices range too")
}
           

檢查數值是否在某個範圍外。

range疊代, 列印 1 到 5

for (x in ) {
    print(x)
}
           

13. 使用Collections

集合的周遊上面已經介紹過,這裡就不說了。

使用lambda表達式對集合進行過濾和映射等操作

fun printSpecificFruit(){
     var fruits = listOf("apple", "orange", "pearl", "pineapple")
     fruits.filter { it.contains("ap") }
             .sortedBy { it }
             .map { it.toUpperCase() }
             .forEach { println(it) }
 }
           

其中的關鍵字

it

用來指代集合中的單項。使用

filter

方法過濾内容,

sortedBy

方法對集合排序,

map

方法進行映射,最後列印出來的内容如下:

APPLE

PINEAPPLE

14. 建立類的執行個體

var rectangle = Rectangle(, ) 
var triangle = Triangle(, , )
           

和Java相比,連關鍵字

new

都不用了。

第一次接觸Kotlin,難免了解有誤,請不吝指教。