学习新语言的最好办法是寻找差异,并记录,最后只要不断巩固差异!
1. 每个数字类型支持如下的转换:
toByte(): Byte
toShort(): Short
toInt(): Int
toLong(): Long
toFloat(): Float
toDouble(): Double
toChar(): Char
2. 位运算
shl(bits) – 有符号左移
shr(bits) – 有符号右移
ushr(bits) – 无符号右移
and(bits) – 位与
or(bits) – 位或
xor(bits) – 位异或
inv() – 位非
// example
val x = (1 shl 2) and 0x000FF000
3. row string
val text = """
for (c in "foo")
print(c)
"""
你可以通过 trimMargin() 函数去除前导空格:
val text = """
|Tell me and I forget.
|Teach me and I remember.
|Involve me and I learn.
|(Benjamin Franklin)
""".trimMargin()
val text = """
|Tell me and I forget.
|Teach me and I remember.
|Involve me and I learn.
|(Benjamin Franklin)
""".trimMargin()
默认 | 用作边界前缀,但你可以选择其他字符并作为参数传入,比如 trimMargin(">")。
4. When 表达式
// 最简单的写法
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // 注意这个块
print("x is neither 1 nor 2")
}
}
// 多种case可以合并
when (x) {
0, 1 -> print("x == 0 or x == 1")
else -> print("otherwise")
}
// case不一定非要固定的value,也可以是表达式
when (x) {
parseInt(s) -> print("s encodes x")
else -> print("s does not encode x")
}
// case是在某个范围内
when (x) {
in 1..10 -> print("x is in the range")
in validNumbers -> print("x is valid")
!in 10..20 -> print("x is outside the range")
else -> print("none of the above")
}
// 甚至是各种判断
fun hasPrefix(x: Any) = when(x) {
is String -> x.startsWith("prefix")
else -> false
}
5. for循环
// in 后可以是一个数组变量,也可以是临时的数组,如:`for(item: Int in 1..3)`
for (item: Int in ints) {
// ……
}
// 同时获得index和value
for ((index, value) in array.withIndex()) {
println("the element at $index is $value")
}
6. 退出多层循环
loop@ for (i in 1..100) {
for (j in 1..100) {
if (……) break@loop
}
}
fun foo() {
listOf(1, 2, 3, 4, 5).forEach lit@{
if (it == 3) return@lit // 局部返回到该 lambda 表达式的调用者,即 forEach 循环
print(it)
}
print(" done with explicit label")
}
7. 内部类访问父级指定的类
// 访问指定父类的实现
class FilledRectangle: Rectangle() {
fun draw() { /* …… */ }
val borderColor: String get() = "black"
inner class Filler {
fun fill() { /* …… */ }
fun drawAndFill() {
super@FilledRectangle.draw() // 调用 Rectangle 的 draw() 实现
fill()
println("Drawn a filled rectangle with color ${super@FilledRectangle.borderColor}") // 使用 Rectangle 所实现的 borderColor 的 get()
}
}
}
// 集成了多个类并访问父级实现
open class Rectangle {
open fun draw() { /* …… */ }
}
interface Polygon {
fun draw() { /* …… */ } // 接口成员默认就是“open”的
}
class Square() : Rectangle(), Polygon {
// 编译器要求覆盖 draw():
override fun draw() {
super<Rectangle>.draw() // 调用 Rectangle.draw()
super<Polygon>.draw() // 调用 Polygon.draw()
}
}
最近工作内容有点分散,下次回来再继续。。。
网友评论