lateinit var modelHolder: ModelHolder
java
使用lateinit關鍵字,能夠稍後初始化。bash
val name: String by lazy { "sherlbon" }
ide
用到時候,再初始化。ui
在java中使用static關鍵字聲明類方法和類變量。this
kotlin中使用companion object聲明類方法和類變量。url
companion object {
var retrofit = Retrofit.Builder()
.baseUrl(AppConfig.HttpConfig.BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(getOkHttpClient())
.build()
}
複製代碼
注意若是須要在java也能調用到,須要增長@JvmField
修飾變量和@JvmStatic
修飾方法。spa
在java中咱們常用new 接口名{}
來直接實現一個接口對象。線程
onWeiboChangedListener listener = new onWeiboChangedListener() {
@Override
public void onWeiboChanged(Weibo weibo) {
···
}
};
複製代碼
在kotlin中使用object:接口名{}
3d
var listener = object : onWeiboChangedListener {
override fun onWeiboChanged(weibo: Weibo) {
···
}
}
複製代碼
data class entity_null_obj(var s1: String,var s2: String)
code
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) }
複製代碼
若是用到調用者,能夠指定this@MainActivity
或this@Listener
能夠用return@forEach
指定返回的目標,@後面能夠有不少能夠指定。
if (obj is Invoice){
obj.calculateTotal()
}
複製代碼
?的做用是告訴程序這裏可能是null。程序這裏會自動判斷,若是是null就不會繼續執行致使拋出異常。
!!的做用是告訴程序這裏毫不多是null。
val data = mapOf(1 to "one", 2 to "two")
fun Context.toast(message: CharSequence) = Toast.makeText(this, message, Toast.LENGTH_SHORT).show()
給Context對象增長了toast()方法。這句代碼能夠寫在程序中的任何位置。
直接用控件id引用。能夠對butterknife說再見了。
val x = 4
val y = 7
print("sum of $x and $y is ${x + y}") // sum of 4 and 7 is 11
複製代碼
//默認參數
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
複製代碼
val john1 = Person("John")
val john2 = Person("John")
john1 == john2 // true (structural equality)
john1 === john2 // false (referential equality)
複製代碼
能夠用==替代equal了。
val res: Boolean = when (x) {
1 -> true
2 -> false
3, 4 -> true
in 5..10 -> true
is String -> true
else -> throw IllegalStateException()
}
複製代碼
能夠直接取到返回值。
doAsync {
val url = "https://www.baidu.com/"
val result = URL(url).readText()
uiThread{
Log.e("TAg", result)
}
}
複製代碼
結合Anko,Anko中有不少很方便的擴展。
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:王二麻子
複製代碼