Fun
// 形参在前类型在后,分号可以忽略
fun sum(a:Int,b:Int):Int {
return a+b
}
// 方法只有一个表达式,隐士返回类型
fun sum(a:Int, b:Int)=a+b
fun p(a:Int)=print(a)
fun sum(a:Int, b:Int)[:Unit] {
return a + b
}
// 最后一个表达式可作为返回值
fun t() {
2 + 3
}
// 支持默认参数
fun foo(a: Int = 0, b: String = "") { ... }
Declear
val a : Int = 1
如果kotlin可推断出类型,则类型可不写
val b = 3
String Templates
fun (str:String,strs:Array<String>) {
print("str=$str, first = ${strs[0]}")
}
Null Check
Type? 表示可以为空的类型,可以理解为可为空类型
可以把null赋值给此类类型的变量
var a:Activity? = null // right
var a2:Activity = null // wrong
在一个block钟如果对某变量做完非空判断后自动由Type?类型转换为Type类型
var s : String? = null;
// s.get(1).toString() wrong here
if (s == null) return ""
return s.get(1).toString()
if not null test
var a:String? = null
a?.length // type is Int?
a?.length ?: 0 // a 为空返回a的长度否则返回0
Type? 如果为null时其toStirng 返回"null"
增强版instanceof
var a : Any? = null
if (a is String)
a.length
When
fun cases(obj: Any) {
when (obj) {
1 -> print("One")
"Hello" -> print("Greeting")
is Long -> print("Long")
!is String -> print("Not a string")
else -> print("Unknown")
}
}
Lambda
names.filter { it.startsWith("A") }
.sortedBy { it }
.map { it.toUpperCase() }
.forEach { print(it) }
Data Class
data class Customer(val name:String, val email:String)
自动有get set 属性
系统覆写 equals hasCode toString coy方法
可以通过componenet1() ... 访问属性
Read-only Collections
类似 Python 提供不可更改的容器
val list = listOf("a", "b")
val map = mapOf("a" to 1, "b" to 2)
access map accross map["a"]=1
Extension Fun
internal fun <T> Activity.bind(id:Int):T? {
val v = this.findViewById(id)
return v as? T
}
// eg:
var mSearchLinear: LinearLayout? = null;
mSearchLinear = bind(R.id.am_search_linear)
internal fun <T> View.bind(id:Int):T? {
val v = this.findViewById(id)
return v as? T
}
internal fun Context.toast(message: String, length: Int = Toast.LENGTH_SHORT) {
Toast.makeText(this, message,
if (length == Toast.LENGTH_SHORT) length else Toast.LENGTH_LONG).show()
}
With
类似vb和js kotlin支持with对同一个对象多步骤操作
Stream
val stream = Files.newInputStream(Paths.get("/some/file.txt"))
stream.buffered().reader().use { reader ->
println(reader.readText())
}