Kotlin慣用語法(優先推薦閱讀)

陳桐同學發表於2018-11-20

作者:陳桐 2018.9.28

####kotlin模擬執行器 try.kotlinlang.org/

####慣用語法

  • 函式定義
//有返回值
fun sum(a: Int, b: Int): Int {
    return a + b
}

//無返回值
fun printSum(a: Int, b: Int) {
println("sum of $a and $b is ${a + b}")
}
複製程式碼
  • 定義變數
//只讀
val a: Int = 1

//變數
var x = 5
複製程式碼
  • 字串模板 $
var a = 1 
val s1 = "a is $a"
複製程式碼
  • 條件表示式統一寫法
if (a > b) {
        return a
} else {
        return b 
}
複製程式碼
  • 空值校驗 null

當某個變數的值可以為 null 的時候,必須在宣告處的型別後新增 ? 來標識該引用可為空

val str: String ?= null
複製程式碼
  • 資料型別檢測
fun getStringLength(obj: Any): Int?{
    if(obj is String){
        return obj.length
    }
    return null
}
複製程式碼
  • 使用for迴圈

1、類似java增強for迴圈

//推薦這種寫法
val items = listOf("apple", "banana", "kiwifruit") 
for (item in items) {
    println(item)
}
複製程式碼

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

while迴圈方法 優點:對index進行精確控制

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

區間方法

//升序
val n = 11
for (x in 1..n step 2) 
{ 
    print(x)
}
複製程式碼

//降序
for (x in 9 downTo 0 step 3) 
{
    print(x) 
}
複製程式碼
  • 區間檢測

1、是否在某範圍內

val x = 10
val y = 9
if (x in 1..y+1) {
    println("fits in range") 
}
複製程式碼
  • when 表示式 (取代switch)
when (x) {
    1 -> print("x == 1") 
    2 -> print("x == 2") 
    else -> { // default
        print("x is neither 1 nor 2") 
    }
}
複製程式碼
  • 集合遍歷
//推薦用法
for (item in items) {
    println(item)
}
複製程式碼

//推薦用法
for ((key, value) in map) {
    println("$key -> $value")
}
複製程式碼

或 判斷集合是否包含

when {
    "orange" in items -> println("juicy")
    "apple" in items -> println("apple is fine too")
}
複製程式碼

或 使用 lambda 表示式來過濾(filter)與對映(map)集合:

val fruits = listOf("banana", "avocado", "apple", "kiwifruit")

fruits
    .filter{ it.startsWith("a") }
    .sortedBy { it }
    .map { it.toUpperCase() }
    .forEach { println(it) }
複製程式碼
  • 建立物件 不需要“new”關鍵字
 val rectangle = Rectangle(5.0, 2.0)
複製程式碼

####習慣用法

  • 建立實體類
//推薦實體類要有預設引數
data class Customer(val name: String = "", var email: String = "")

var customer: Customer = Customer("chentong","7045xxx")
println(customer.toString())

var customer01: Customer = Customer(name="kk")
customer01.email = "1986xxx"    println(customer01.toString())

//強烈推薦這種寫法 語義清晰
var customer02: Customer = Customer(name="tong",email="890xxx")
println(customer02.toString())

var customer03: Customer = Customer("03")
customer03.email = "1986xxx"
println(customer03.toString())

var customer04: Customer = Customer()
println(customer04.toString())
複製程式碼

1)自帶getter、setter、toString、hashcode方法 2)val(只讀) 沒有setter方法 3)如果生成的類需要含有一個無參的建構函式,則所有的屬性必須指定預設值

  • 函式預設引數
fun foo(a: Int = 0, b: String = "") { ...... }
複製程式碼
  • 過濾 list(filter 內是判斷條件)
val listdata = listOf(1, 2, 3, -1)
println(listdata.toString())
    
var newdata = listdata.filter{ it > 0 } 
println(newdata.toString())
複製程式碼
  • map建立
//列印map
fun printMap(map: Map<String,Any?>){
    for ((key, value) in map) {
        println("$key -> $value")
    }
}

//強烈推薦第一種寫法 語義清晰
var map = HashMap<String,Any?>()
map.put("chen","tong")
map.put("yang","yue")
printMap(map)

var map01 = mutableMapOf<String, Any?>()
map01["chen01"] = "tong"
map01["yang01"] = "yue"
printMap(map01)

var map02: HashMap<String,String> = HashMap()
map02.put("chen02","tong")
map02.put("yang02","yue")
printMap(map02)

var chen03 = "tong"
var yang03 ="yue"
var yuan03 = "dong"
//左key,右value    
var map03 = mutableMapOf("chen03" to chen03, "yang03" to yang03,"yuan03" to yuan03)
printMap(map03)

val map04: MutableMap<String, Any?> = mutableMapOf()
map04.put("chen04","tong")
map04.put("yang04","yue")
map04["yuan04"] = "dong"
printMap(map04)
複製程式碼

強烈推薦第一種寫法 原因: 1、簡單少,語法清晰, 2、與java寫法一致,上手成本低,易於理解 3、分辨map是到底哪種實現方式很重要

  • list建立
//list列印
fun printList(list: List<Any?>){
    for (item in list) {
        println("$item")
    }
    println("===end===")
}

val lists = listOf("lists", "123", "456") 
//沒有add方法
printList(lists)

//強烈推薦這種寫法
var lists01 = ArrayList<String>()
lists01.add("lists01")
lists01.add("banana")    
printList(lists01)

val lists02: MutableList<String> = mutableListOf("lists02","02121")
lists02.add("testadd")
printList(lists02)

//推薦這種寫法
var lists03: MutableList<String> = mutableListOf()
lists03.add("lists03")
lists03.add("676767")
printList(lists03)

複製程式碼

推薦第2、4種寫法,清晰,簡潔

  • 只讀list map
val list = listOf("a", "b", "c")

val map = mapOf("a" to 1, "b" to 2, "c" to 3)
複製程式碼
  • 訪問map
var map = HashMap<String,String>()
map.put("chen","tong")
map["zhang"] = "san"     

println(map.get("zhang"))    
println(map.get("chen"))

println(map["zhang"]) 
println(map["chen"])
複製程式碼

快速訪問推薦下面?

println(map["key"]) 
map["key"] = value
複製程式碼
  • 延遲屬性
val p: String by lazy { 
// 計算該字串
}
複製程式碼
  • 建立單例
object Resource {
    val name = "Name"
}
複製程式碼

#####安全判斷

  • if not null縮寫
val lists = listOf("123")
println(lists?.size)
複製程式碼
  • if not null{} else{} 縮寫
val lists = listOf("123")
println(lists?.size ?: "empty")
println("內容" ?: "empty")
println(null ?: "empty")
複製程式碼
  • if not null
val lists = listOf("123")
lists?.let {
	// 程式碼會執行到此處, 假如data不為null
    println(lists.size)
}
複製程式碼
  • 返回 when 表示式
fun transform(color: String): Int { 
    return when (color) {
        "Red" -> 0
        "Green" -> 1
        "Blue" -> 2
        else -> throw IllegalArgumentException("Invalid color param value")
	} 
}

println(transform("Red"))

println(transform("1"))
複製程式碼
  • 單表示式用法
fun theAnswer() = 42
//等於
fun theAnswer(): Int {
    return 42
}
複製程式碼
  • 一個物件呼叫多種方法
class Turtle {
    fun penDown(){
    	println("penDown()")
    }
	
    fun penUp(){
    	println("penUp()")
	}
    
	fun turn(degrees: Double){
    	println("turn($degrees)" )
	}
    
	fun forward(pixels: Double){
    	println("forward($pixels)")
	}
}

val myTurtle = Turtle()
with(myTurtle) { // 畫一個 100 畫素的正方形
    penDown()
	for(i in 1..4) 
    {
        forward(100.0)
        turn(90.0)
    }
    penUp() 
}
複製程式碼
  • 優先使用try 、if 與 when表達形式
return if (x) foo() else bar()

return when(x) {
    0 -> "zero"
    else -> "nonzero"
}
複製程式碼

下面程式碼不建議使用

if (x)
    return foo()
else
    return bar()

when(x) {
    0 -> return "zero"
    else -> return "nonzero"
}
複製程式碼

if 適用兩個條件 when 適用多個條件

相關文章