Android鬼點子-關於kotlin的幾招祖傳手藝

我是綠色大米呀發表於2018-01-10

圖1
kotlin用上之後就戒不了啦!!!

1.稍後初始化

lateinit var modelHolder: ModelHolder

使用lateinit關鍵字,可以稍後初始化。

val name: String by lazy { "sherlbon" }

用到時候,再初始化。

2.使用類方法,類變數

在java中使用static關鍵字宣告類方法和類變數。

kotlin中使用companion object宣告類方法和類變數。

companion object {
        var retrofit = Retrofit.Builder()
                .baseUrl(AppConfig.HttpConfig.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .client(getOkHttpClient())
                .build()
                }
複製程式碼

注意如果需要在java也能呼叫到,需要增加@JvmField修飾變數和@JvmStatic修飾方法。

3.直接實現介面

在java中我們經常使用new 介面名{}來直接實現一個介面物件。

onWeiboChangedListener listener = new onWeiboChangedListener() {
				@Override
				public void onWeiboChanged(Weibo weibo) {
				···
				}
			};
複製程式碼

在kotlin中使用object:介面名{}

var listener = object : onWeiboChangedListener {
                override fun onWeiboChanged(weibo: Weibo) {
                ···
                }
            }
複製程式碼

4.實體類

data class entity_null_obj(var s1: String,var s2: String)

5.迴圈查詢

val person = personList.find { it.id == somePersonId }

val 宣告常量,會遍歷personList,it代表每個成員。

迴圈遍歷 selected.forEach {it}

過濾 val positiveNumbers = list.filter { it > 0 }

你還可以這樣:

persons
  .filter { it.age >= 18 }
  .sortedBy { it.name }
  .map { it.email }
  .forEach { print(it) }
複製程式碼

6.this和return

如果用到呼叫者,可以指定this@MainActivitythis@Listener

可以用return@forEach指定返回的目標,@後面可以有很多可以指定。

7.判斷型別

if (obj is Invoice){
        obj.calculateTotal()
        }
複製程式碼

8.?和!!

?的作用是告訴程式這裡可能是null。程式這裡會自動判斷,如果是null就不會繼續執行導致丟擲異常。

!!的作用是告訴程式這裡絕不可能是null。

9.鍵值對

val data = mapOf(1 to "one", 2 to "two")

10.擴充套件方法

fun Context.toast(message: CharSequence) = Toast.makeText(this, message, Toast.LENGTH_SHORT).show()

給Context物件增加了toast()方法。這句程式碼可以寫在程式中的任何位置。

11.再也不用findViewById

直接用控制元件id引用。可以對butterknife說再見了。

12.字串差值

val x = 4
val y = 7
print("sum of $x and $y is ${x + y}")  // sum of 4 and 7 is 11
複製程式碼

13.引數隨便玩

//預設引數
fun build(title: String, width: Int = 800, height: Int = 600) {
    Frame(title, width, height)
}

//可以通過引數名傳遞引數
build("PacMan", 400, 300)                           // equivalent
build(title = "PacMan", width = 400, height = 300)  // equivalent
build(width = 400, height = 300, title = "PacMan")  // equivalent
複製程式碼

14.這就是你想要的相等

val john1 = Person("John")
val john2 = Person("John")

john1 == john2    // true  (structural equality)
john1 === john2   // false (referential equality)
複製程式碼

可以用==替代equal了。

15.升級後的switch

val res: Boolean = when (x) {
    1 -> true
    2 -> false
    3, 4 -> true
    in 5..10 -> true
    is String -> true
    else -> throw IllegalStateException()
}
複製程式碼

可以直接取到返回值。

16.執行緒切換

doAsync {
        val url = "https://www.baidu.com/"
        val result = URL(url).readText()
        uiThread{
            Log.e("TAg", result)
        }
    }
複製程式碼

結合Anko,Anko中有很多很方便的擴充套件。

17.屬性觀察

import kotlin.properties.Delegates

class User {
    var name: String by Delegates.observable("張三") {
        prop, old, new ->
        println("old:$old -> new:$new")
    }
}

fun main(args: Array<String>) {
    val user = User()
    user.name = "李四"
    user.name = "王二麻子"
}
複製程式碼

輸出:

old:張三 -> new:李四
old:李四 -> new:王二麻子
複製程式碼

Android鬼點子-關於kotlin的幾招祖傳手藝

相關文章