When表达式
加强版的switch,支持任意类型
支持纯表达式条件分支(类似于if)
表达是必须得完整
fun main(args: Array<String>) {
val x = 5
when(x){
//是否是int
is Int -> println("hello $x")
//是在区间范围内
in 1..100 -> println("$x 在1-100区间内")
//不在区间内
!in 1..100 -> println("$x 不在1-100区间内")
//判断x和下面的表达式值是不是一样
args[0].toInt() -> println("参数和 $x 一样")
}
val mode = when{
args.isNotEmpty() && args[0] == "1" ->1
else -> 0
}
println(mode)
}
is 运算符检测一个表达式是否某类型的一个实例。 如果一个不可变的局部变量或属性已经 判断出为某类型,那么检测后的分支中可以直接当作该类型使用,无需显式转换:
//sampleStart
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// `obj` 在该条件分支内自动转换成 `String`
return obj.length
}
// 在离开类型检测分支后,`obj` 仍然是 `Any` 类型
return null
}
使用 lambda 表达式来过滤(filter)和映射(map)集合:
fun main(args: Array<String>) {
val fruits = listOf("banana", "avocado", "apple", "kiwi")
//sampleStart
fruits
.filter { it.startsWith("a") }
.sortedBy { it }
.map { it.toUpperCase() }
.forEach { println(it) }
//sampleEnd
}
创建 DTOs(POJOs/POCOs)
data class Customer(val name: String, val email: String)
会为 Customer 类提供以下功能: 所有属性的 getters (对于 var 定义的还有 setters) equals() hashCode() toString() copy() 所有属性的 component1() 、 component2() ……等等(参见数据类)
过滤 list
val positives = list.filter { x -> x > 0 }
//或者可以更短:
val positives = list.filter { it > 0 }
遍历 map/pair型list
for ((k, v) in map) {
println("$k -> $v")
}
k 、 v 可以改成任意名字。
使用区间
for (i in 1..100) { …… } // 闭区间:包含 100
for (i in 1 until 100) { …… } // 半开区间:不包含 100
for (x in 2..10 step 2) { …… }
for (x in 10 downTo 1) { …… }
if (x in 1..10) { …… }
延迟属性
val p: String by lazy {
// 计算该字符串
}
扩展函数
fun String.spaceToCamelCase() { …… }
//使用
"Convert this to camelcase".spaceToCamelCase()
创建单例
object Resource {
val name = "Name"
}
对一个对象实例调用多个方法 ( with )
class Turtle {
fun penDown()
fun penUp()
fun turn(degrees: Double)
fun forward(pixels: Double)
}
val myTurtle = Turtle()
with(myTurtle) { // 画一个 100 像素的正方形
penDown()
for(i in 1..4) {
forward(100.0)
turn(90.0)
}
penUp()
}
合并集合
val list = listOf(1..10,11..20)
val flatList = list.flatMap{it}
flatList.forEach(::println)//输出1...20
集合元素迭代操作
val list = listOf(1..10)
println(list.reduce { acc, i -> i + acc })//输出1到10的和
//带初始值的迭代
println(list.fold(5){acc, i -> i + acc }) //输出初始值为5,叠加1到10的的和
有条件的迭代
val list = listOf(1,2,3,4,5,6)
list.takeWhile { it % 2 == 1}.forEach(::println)//只输出1,当出现不满足条件元素时马上终止