Kotlin 系列(二) 基本語法(1)

屬性與變量

Kotlin 類中的屬性,既可使用關鍵字 var 聲明爲可變的,也能夠用 val 聲明爲只能賦值一次的只讀變量。node

變量

/**
*只讀變量
*/
val a: Int = 1 //當即賦值

val b = 30 //自動推斷出 Int 類型

val c = "hello" //自動推斷出 String 類型
/**
*可變變量
*/
var name: String = "keven" //當即賦值

var age: Int = 18 //當即賦值

var address: String = "北京" //當即賦值
複製代碼

Kotlin 中使用關鍵字 class 聲明類編程

class Person { 
    
}
複製代碼
構造函數

在 Kotlin 中的一個類能夠有一個主構造函數以及一個或多個次構造函數。主構造函數是類頭的一部分:它跟在類名(與可選的類型參數)後。安全

class Person constructor(firstName: String) {
    
}
複製代碼

若是主構造函數沒有任何註解或者可見性修飾符,能夠省略這個 constructor 關鍵字。bash

class Person(firstName: String) { 
}
複製代碼

也能夠在類中定義次構造函數編程語言

class Person {

    //定義一些可變變量
    var name: String = "keven"
    var age: Int = 18
    var address: String = "北京"

    //定義帶參數構造函數
    constructor(name: String, age: Int, address: String) {
        this.name = name
        this.age = age
        this.address = address
    }
    
    //無參構造函數
    constructor()

}
複製代碼

使用 Person 類函數

//Kotlin 中沒有 new 關鍵字
var result = Person()  //使用無參構造函數
result.name = "KEVEN"  //給變量賦值
result.age = 19
result.address = "上海"

//使用有參構造函數
var person=Person("Keven",20,"深圳")
複製代碼

函數

Kotlin 中的函數使用 fun 關鍵字聲明學習

1. 定義帶參函數

注意:若是一個函數不返回任何有用的值,它的返回類型是 Unit。Unit 是一種只有一個值 Unit 的類型。這個值不須要顯式返回ui

//帶有兩個 Int 參數
//$a $b $c 表明引用 a、b、c 的值
fun printSum(a: Int, b: Int) {
    var c=a+b
    println("sum of $a and $b is $c")
}
複製代碼

2. 定義帶參數、帶返回值的函數

//帶有兩個 Int 類型參數,返回值爲 Int 類型
fun Sum(a: Int, b: Int): Int {
    return a + b
}
複製代碼

3.單表達式函數

將表達式做爲函數體,返回值類型自動推斷的函數this

fun sum(a: Int, b: Int) = a + b
複製代碼

4. 定義參數有默認值的函數

//其中 Boolean 類型參數 isMale 默認值爲 true
//其中 Char 類型參數 short 默認值爲 'a'
fun reformat(name: String, isMale: Boolean = true, short: Char = 'a') {

    }
    
//調用有默認值參數的函數時,可不傳有默認值的參數
reformat("CUE")
//固然也能夠全傳遞
reformat("CUE",true,'C')
複製代碼

5. 可變數量參數的函數

函數的參數(一般是最後一個)能夠用 vararg 修飾符標記spa

//使用 vararg 進行參數修飾
fun asList(vararg list: Int) {
    for (a in list)
        println("a = $a")
}
複製代碼

對於可變參數函數進行調用

//傳入任意個數 Int 類型參數
asList(1, 2, 3, 4)

asList(0, 1, 2)
複製代碼

字符串模板

字符串能夠包含模板表達式 ,即一些小段代碼,會求值並把結果合併到字符串中。 模板表達式以美圓符($)開頭,由一個簡單的名字構成:

val i = 10
println("i = $i") // 輸出「i = 10」
複製代碼

或者用花括號括起來的任意表達式:

val s = "abc"
println("$s.length is ${s.length}") // 輸出「abc.length is 3」
複製代碼

原始字符串與轉義字符串內部都支持模板。 若是你須要在原始字符串中表示字面值 $ 字符(它不支持反斜槓轉義),你能夠用下列語法:

val price = """${'$'}9.99"""
println(price)//輸出「$9.99」
複製代碼

if 表達式

在 Kotlin 中,if 是一個表達式,即它會返回一個值。 所以就不須要三元運算符(條件 ? 而後 : 不然),由於普通的 if 就能勝任這個角色。

// 傳統用法
var max = a 
if (a < b) max = b

// With else 
var max: Int
if (a > b) {
    max = a
} else {
    max = b
}
 
// 做爲表達式
val max = if (a > b) a else b
複製代碼

if 的分支能夠是代碼塊,最後的表達式做爲該塊的值

//輸出 a、b 中較大的一項
var a = 1
var b = 2
val max = if (a > b) {
    a
} else {
    b
}
複製代碼

使用可空值及 null 檢測

許多編程語言(包括 Java)中最多見的陷阱之一,就是訪問空引用的成員會致使空引用異常。在 Java 中,這等同於 NullPointerException 或簡稱 NPE。

Kotlin 的類型系統旨在從咱們的代碼中消除 NullPointerException。

使用

在 Kotlin 中,類型系統區分一個引用能夠容納 null (可空引用)仍是不能容納(非空引用)。 例如,String 類型的常規變量不能容納 null:

var a: String = "abc"
a = null // 編譯錯誤
複製代碼

若是要容許爲空,咱們能夠聲明一個變量爲可空字符串,寫做 String?:

var b: String? = "abc"
b = null // ok
print(b)
複製代碼

檢測

val b: String? = "Kotlin"
if (b != null && b.length > 0) {
    print("String of length ${b.length}")
} else {
    print("Empty string")
}
複製代碼

這隻適用於 b 是不可變的狀況(即在檢查和使用之間沒有修改過的局部變量 ,或者不可覆蓋而且有幕後字段的 val 成員),由於不然可能會發生在檢查以後 b 又變爲 null 的狀況。

安全的調用

安全調用操做符,寫做 ?.:

val a = "Kotlin"
val b: String? = null
println(b?.length)
println(a?.length) // 無需安全調用
複製代碼

若是 b 非空,就返回 b.length,不然返回 null,這個表達式的類型是 Int?。

安全調用在鏈式調用中頗有用。例如,若是一個員工 Bob 可能會(或者不會)分配給一個部門, 而且可能有另一個員工是該部門的負責人,那麼獲取 Bob 所在部門負責人(若是有的話)的名字,咱們寫做:

bob?.department?.head?.name
複製代碼

若是任意一個屬性(環節)爲空,這個鏈式調用就會返回 null。

若是要只對非空值執行某個操做,安全調用操做符能夠與 let 一塊兒使用:

val listWithNulls: List<String?> = listOf("Kotlin", null)
for (item in listWithNulls) {
    item?.let { println(it) } // 輸出 Kotlin 並忽略 null
}
複製代碼

安全調用也能夠出如今賦值的左側。這樣,若是調用鏈中的任何一個接收者爲空都會跳過賦值,而右側的表達式根本不會求值:

// 若是 `person` 或者 `person.department` 其中之一爲空,都不會調用該函數:
person?.department?.head = managersPool.getManager()
複製代碼

Elvis 操做符

判斷若是 b 不爲 null ,返回 b 的長度,不然返回 -1

val l: Int = if (b != null) b.length else -1
複製代碼

除了完整的 if-表達式,這還能夠經過 Elvis 操做符表達,寫做 ?:

val l = b?.length ?: -1
複製代碼

若是 ?: 左側表達式非空,elvis 操做符就返回其左側表達式,不然返回右側表達式。 請注意,當且僅當左側爲空時,纔會對右側表達式求值。

請注意,由於 throw 和 return 在 Kotlin 中都是表達式,因此它們也能夠用在 elvis 操做符右側。這可能會很是方便,例如,檢查函數參數:

fun foo(node: Node): String? {
    val parent = node.getParent() ?: return null
    val name = node.getName() ?: throw IllegalArgumentException("name expected")
    // ……
}
複製代碼

安全的類型轉換

若是對象不是目標類型,那麼常規類型轉換可能會致使 ClassCastException。 另外一個選擇是使用安全的類型轉換,若是嘗試轉換不成功則返回 null

val aInt: Int? = a as? Int
複製代碼

可空類型的集合

若是你有一個可空類型元素的集合,而且想要過濾非空元素,你可使用 filterNotNull 來實現

val nullableList: List<Int?> = listOf(1, 2, null, 4)
val intList: List<Int> = nullableList.filterNotNull()
複製代碼

本小節就介紹到這裏,下一小節咱們會繼續學習 Kotlin 的基本語法。

相關文章
相關標籤/搜索