解构声明
val (name, age) = person
println(name)
println(age)
val name = person.component1()
val age = person.component2()
可能遍历一个映射(map)最好的方式就是这样:
for ((key, value) in map) {
集合
Kotlin区分可变集合和不可变集合
- Kotlin 的
List
类型是一个提供只读
操作如 size、get等的接口。改变 list 的方法是由 MutableList
加入的。 - 这一模式同样适用于
Set
/MutableSet
及Map
/MutableMap
。
val numbers: MutableList = mutableListOf(1, 2, 3)
val readOnlyView: List = numbers
println(numbers)
numbers.add(4)
println(readOnlyView)
readOnlyView.clear() val strings = hashSetOf("a", "b", "c", "c")
assert(strings.size == 3)
当调用集合的时候只能用标准库的方法:listOf()、 mutableListOf()、 setOf()、 mutableSetOf()
list和set的扩展方法
val items = listOf(1, 2, 3, 4)
items.first() == 1
items.last() == 4
items.filter { it % 2 == 0 } val rwList = mutableListOf(1, 2, 3)
rwList.requireNoNulls()
if (rwList.none { it > 6 }) println("No items above 6")
val item = rwList.firstOrNull()
区间
区间表达式由具有操作符形式 .. 的 rangeTo 函数辅以 in 和 !in 形成
if (i in 1..10) { println(i)
}
for (i in 4..1) print(i)
for (i in 4 downTo 1) print(i)
step()函数
for (i in 4 downTo 1 step 2) print(i)
until 函数
for (i in 1 until 10) { // i in [1, 10) 排除了 10println(i)
}
一些实用函数
rangeTo()
/downTo()
/reversed()
/step()
类型的检查与转换“is”与“as”
我们可以在运行时通过使用 is 操作符或其否定形式 !is 来检查对象是否符合给定类型:
if (obj is String) {print(obj.length)
}if (obj !is String) { // 与 !(obj is String) 相同print("Not a String")
}
else {print(obj.length)
}
When表达式
when (x) {1 -> print("x == 1")2 -> print("x == 2")else -> { // 注意这个块print("x is neither 1 nor 2")}
}
For循环
for (item in collection) print(item)
如果你想要通过索引遍历一个数组或者一个 list
,你可以这么做:
for (i in array.indices) {print(array[i])
}
或者你可以调用库函数:withIndex
for ((index, value) in array.withIndex()) {println("the element at $index is $value")
}
While循环
while (x > 0) {x--
}do {val y = retrieveData()
} while (y != null)
This表达式
要访问来自外部作用域的this,我们可以使用this@label
class A { inner class B { fun Int.foo() { val a = this@A val b = this@B val c = this val c1 = this@foo val funLit = lambda@ fun String.() {val d = this }val funLit2 = { s: String ->val d1 = this}}}
}
空安全
在Kotlin中String 类型的常规比变量不能容纳null
var a: String = "abc"
a = null
如果允许为空,我们可以声明一个变量为可空字符串,写作String?
var b: String? = "abc"
b = null
在条件中检查null
val l = if (b != null) b.length else -1
安全的调用
使用安全调用操作符,写作?.
b?.length
,:如果b非空,就返回 b.length,否则返回 null,这个表达式的类型是 Int?
Elvis 操作符
val l = b?.length ?: -1
如果?:
左侧表达式非空,elvis 操作符就返回其左侧表达式,否则返回右侧表达式
fun foo(node: Node): String? {val parent = node.getParent() ?: return nullval name = node.getName() ?: throw IllegalArgumentException("name expected")
}
!! 操作符
我们可以写 b!! ,这会返回一个非空的 b 值 (例如:在我们例子中的 String)或者如果 b 为空,就会抛出一个 NPE 异常:
val l = b!!.length
可空类型的集合
如果你有一个可空类型元素的集合,并且想要过滤非空元素,你可以使用 filterNotNull 来实现。
val nullableList: List?> = listOf(1, 2, null, 4)
val intList: List = nullableList.filterNotNull()
反射
函数引用
例如传给另一个函数。 为此,我们使用 :: 操作符:
fun isOdd(x: Int) = x % 2 != 0val numbers = listOf(1, 2, 3)
println(numbers.filter(::isOdd))
属性引用
要把属性作为 Kotlin中 的一等对象来访问,我们也可以使用 :: 运算符:
var x &#61; 1fun main(args: Array<String>) {println(::x.get()) ::x.set(2)println(x)
}