kotlin学习(2)

习惯用法

创建 DTOs(POJOs/POCOs)

1
data class Customer(val name: String, val email: String)

会为 Customer 类提供以下功能:

  • 所有属性的 getters (对于 var 定义的还有 setters)
  • equals()
  • hashCode()
  • toString()
  • copy()
  • 所有属性的 component1()、 component2()……等等

函数的默认参数

1
fun foo(a: Int = 0, b: String = "") { …… }

过滤 list

1
2
3
val positives = list.filter { x -> x > 0 }
val positives = list.filter { it > 0 }

String 内插

1
println("Name $name")

类型判断

1
2
3
4
5
when (x) {
is Foo //-> ……
is Bar //-> ……
else //-> ……
}

遍历 map/pair型list

1
2
3
for ((k, v) in map) {
println("$k -> $v")
}

k、v 可以改成任意名字。

使用区间

1
2
3
4
5
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) { …… }

只读 list

1
val list = listOf("a", "b", "c")

只读 map

1
val map = mapOf("a" to 1, "b" to 2, "c" to 3)

访问 map

1
2
println(map["key"])
map["key"] = value

延迟属性

1
2
3
val p: String by lazy {
// 计算该字符串
}

扩展函数

1
2
3
fun String.spaceToCamelCase() { …… }
"Convert this to camelcase".spaceToCamelCase()

创建单例

1
2
3
object Resource {
val name = "Name"
}

If not null 缩写

1
2
3
val files = File("Test").listFiles()
println(files?.size)

If not null and else 缩写

1
2
3
val files = File("Test").listFiles()
println(files?.size ?: "empty")

if null 执行一个语句

1
2
val data = ……
val email = data["email"] ?: throw IllegalStateException("Email is missing!")

if not null 执行代码

1
2
3
4
5
val data = ……
data?.let {
…… // 代码会执行到此处, 假如data不为null
}

映射可空值(如果非空的话)

1
2
3
val data = ……
val mapped = data?.let { transformData(it) } ?: defaultValueIfDataIsNull

返回 when 表达式

1
2
3
4
5
6
7
8
fun transform(color: String): Int {
return when (color) {
"Red" -> 0
"Green" -> 1
"Blue" -> 2
else -> throw IllegalArgumentException("Invalid color param value")
}
}

“try/catch”表达式

1
2
3
4
5
6
7
8
9
fun test() {
val result = try {
count()
} catch (e: ArithmeticException) {
throw IllegalStateException(e)
}
// 使用 result
}

“if”表达式

1
2
3
4
5
6
7
8
9
fun foo(param: Int) {
val result = if (param == 1) {
"one"
} else if (param == 2) {
"two"
} else {
"three"
}
}

返回类型为 Unit 的方法的 Builder 风格用法

1
2
3
fun arrayOfMinusOnes(size: Int): IntArray {
return IntArray(size).apply { fill(-1) }
}

单表达式函数

1
2
3
4
5
fun theAnswer() = 42
fun theAnswer(): Int {
return 42
}

单表达式函数与其它惯用法一起使用能简化代码,例如和 when 表达式一起使用:

1
2
3
4
5
6
fun transform(color: String): Int = when (color) {
"Red" -> 0
"Green" -> 1
"Blue" -> 2
else -> throw IllegalArgumentException("Invalid color param value")
}

对一个对象实例调用多个方法 (with)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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()
}

Java 7 的 try with resources

1
2
3
4
val stream = Files.newInputStream(Paths.get("/some/file.txt"))
stream.buffered().reader().use { reader ->
println(reader.readText())
}

对于需要泛型信息的泛型函数的适宜形式

1
2
3
4
5
6
// public final class Gson {
// ……
// public <T> T fromJson(JsonElement json, Class<T> classOfT) throws JsonSyntaxException {
// ……
inline fun <reified T: Any> Gson.fromJson(json): T = this.fromJson(json, T::class.java)

使用可空布尔

1
2
3
4
5
6
val b: Boolean? = ……
if (b == true) {
……
} else {
// `b` 是 false 或者 null
}

当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器