Kotlin 系列(二) 基本语法(1)
屬性與變量
Kotlin 類中的屬性,既可以使用關鍵字 var 聲明為可變的,也可以用 val 聲明為只能賦值一次的只讀變量。
變量
/** *只讀變量 */ 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 { } 復制代碼構造函數(shù)
在 Kotlin 中的一個類可以有一個主構造函數(shù)以及一個或多個次構造函數(shù)。主構造函數(shù)是類頭的一部分:它跟在類名(與可選的類型參數(shù))后。
class Person constructor(firstName: String) {} 復制代碼如果主構造函數(shù)沒有任何注解或者可見性修飾符,可以省略這個 constructor 關鍵字。
class Person(firstName: String) { } 復制代碼也可以在類中定義次構造函數(shù)
class Person {//定義一些可變變量var name: String = "keven"var age: Int = 18var address: String = "北京"//定義帶參數(shù)構造函數(shù)constructor(name: String, age: Int, address: String) {this.name = namethis.age = agethis.address = address}//無參構造函數(shù)constructor()} 復制代碼使用 Person 類
//Kotlin 中沒有 new 關鍵字 var result = Person() //使用無參構造函數(shù) result.name = "KEVEN" //給變量賦值 result.age = 19 result.address = "上海"//使用有參構造函數(shù) var person=Person("Keven",20,"深圳") 復制代碼函數(shù)
Kotlin 中的函數(shù)使用 fun 關鍵字聲明
1. 定義帶參函數(shù)
注意:如果一個函數(shù)不返回任何有用的值,它的返回類型是 Unit。Unit 是一種只有一個值 Unit 的類型。這個值不需要顯式返回
//帶有兩個 Int 參數(shù) //$a $b $c 代表引用 a、b、c 的值 fun printSum(a: Int, b: Int) {var c=a+bprintln("sum of $a and $b is $c") } 復制代碼2. 定義帶參數(shù)、帶返回值的函數(shù)
//帶有兩個 Int 類型參數(shù),返回值為 Int 類型 fun Sum(a: Int, b: Int): Int {return a + b } 復制代碼3.單表達式函數(shù)
將表達式作為函數(shù)體,返回值類型自動推斷的函數(shù)
fun sum(a: Int, b: Int) = a + b 復制代碼4. 定義參數(shù)有默認值的函數(shù)
//其中 Boolean 類型參數(shù) isMale 默認值為 true //其中 Char 類型參數(shù) short 默認值為 'a' fun reformat(name: String, isMale: Boolean = true, short: Char = 'a') {}//調(diào)用有默認值參數(shù)的函數(shù)時,可不傳有默認值的參數(shù) reformat("CUE") //當然也可以全傳遞 reformat("CUE",true,'C') 復制代碼5. 可變數(shù)量參數(shù)的函數(shù)
函數(shù)的參數(shù)(通常是最后一個)可以用 vararg 修飾符標記
//使用 vararg 進行參數(shù)修飾 fun asList(vararg list: Int) {for (a in list)println("a = $a") } 復制代碼對于可變參數(shù)函數(shù)進行調(diào)用
//傳入任意個數(shù) Int 類型參數(shù) 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” 復制代碼原始字符串與轉義字符串內(nèi)部都支持模板。 如果你需要在原始字符串中表示字面值 $ 字符(它不支持反斜杠轉義),你可以用下列語法:
val price = """${'$'}9.99""" println(price)//輸出“$9.99” 復制代碼if 表達式
在 Kotlin 中,if 是一個表達式,即它會返回一個值。 因此就不需要三元運算符(條件 ? 然后 : 否則),因為普通的 if 就能勝任這個角色。
// 傳統(tǒng)用法 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 的類型系統(tǒng)旨在從我們的代碼中消除 NullPointerException。
使用
在 Kotlin 中,類型系統(tǒng)區(qū)分一個引用可以容納 null (可空引用)還是不能容納(非空引用)。 例如,String 類型的常規(guī)變量不能容納 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 成員),因為否則可能會發(fā)生在檢查之后 b 又變?yōu)?null 的情況。
安全的調(diào)用
安全調(diào)用操作符,寫作 ?.:
val a = "Kotlin" val b: String? = null println(b?.length) println(a?.length) // 無需安全調(diào)用 復制代碼如果 b 非空,就返回 b.length,否則返回 null,這個表達式的類型是 Int?。
安全調(diào)用在鏈式調(diào)用中很有用。例如,如果一個員工 Bob 可能會(或者不會)分配給一個部門, 并且可能有另外一個員工是該部門的負責人,那么獲取 Bob 所在部門負責人(如果有的話)的名字,我們寫作:
bob?.department?.head?.name 復制代碼如果任意一個屬性(環(huán)節(jié))為空,這個鏈式調(diào)用就會返回 null。
如果要只對非空值執(zhí)行某個操作,安全調(diào)用操作符可以與 let 一起使用:
val listWithNulls: List<String?> = listOf("Kotlin", null) for (item in listWithNulls) {item?.let { println(it) } // 輸出 Kotlin 并忽略 null } 復制代碼安全調(diào)用也可以出現(xiàn)在賦值的左側。這樣,如果調(diào)用鏈中的任何一個接收者為空都會跳過賦值,而右側的表達式根本不會求值:
// 如果 `person` 或者 `person.department` 其中之一為空,都不會調(diào)用該函數(shù): 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 操作符右側。這可能會非常方便,例如,檢查函數(shù)參數(shù):
fun foo(node: Node): String? {val parent = node.getParent() ?: return nullval name = node.getName() ?: throw IllegalArgumentException("name expected")// …… } 復制代碼安全的類型轉換
如果對象不是目標類型,那么常規(guī)類型轉換可能會導致 ClassCastException。 另一個選擇是使用安全的類型轉換,如果嘗試轉換不成功則返回 null
val aInt: Int? = a as? Int 復制代碼可空類型的集合
如果你有一個可空類型元素的集合,并且想要過濾非空元素,你可以使用 filterNotNull 來實現(xiàn)
val nullableList: List<Int?> = listOf(1, 2, null, 4) val intList: List<Int> = nullableList.filterNotNull() 復制代碼本小節(jié)就介紹到這里,下一小節(jié)我們會繼續(xù)學習 Kotlin 的基本語法。
轉載于:https://juejin.im/post/5ce8e137f265da1b5f2630fa
總結
以上是生活随笔為你收集整理的Kotlin 系列(二) 基本语法(1)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。