这里是一些在 Kotlin 中经常使用的习语。如果你有特别喜欢的习语想要贡献出来,赶快发起 pull request 吧。

    函数默认参数

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

    过滤 list

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

    字符串插值

    1. println("Name $name")

    实例检查

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

    遍历 map/list 键值对

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

    k,v 可以随便命名

    使用 ranges

    1. for (i in 1..100) { ... } // 闭区间: 包括100
    2. for (i in 1 until 100) { ... } // 半开区间: 不包括100
    3. for (x in 2..10 step 2) { ... }
    4. 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)

    懒属性(延迟加载)

    1. val p: String by lazy {
    2. // compute the string
    3. }

    扩展函数

    1. fun String.spcaceToCamelCase() { ... }
    2. "Convert this to camelcase".spcaceToCamelCase()

    创建单例模式

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

    如果不为空则… 的简写

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

    如果不为空…否则… 的简写

    1. val files = File("test").listFiles()

    如果声明为空执行某操作

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

    如果不为空执行某操作

    1. val date = ...
    2. data?.let{
    3. ...//如果不为空执行该语句块
    4. }

    如果不空则映射(Map nullable value if not null)

    1. val data = ...
    2. val mapped = data?.let { transformData(it) } ?: defaultValueIfDataIsNull
    1. fun transform(color: String): Int {
    2. return when (color) {
    3. "Red" -> 0
    4. "Green" -> 1
    5. "Blue" -> 2
    6. else -> throw IllegalArgumentException("Invalid color param value")
    7. }
    8. }

    try-catch 表达式

    if 表达式

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

    使用生成器模式返回 Unit

    1. fun arrayOfMinusOnes(size: Int): IntArray {
    2. }

    单表达式函数

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

    可以和其它习语组合成高效简洁的代码。譬如说 when 表达式:

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

    利用 with 调用一个对象实例的多个方法

    1. class Turtle {
    2. fun penDown()
    3. fun penUp()
    4. fun turn(degrees: Double)
    5. fun forward(pixels: Double)
    6. }
    7. val myTurtle = Turtle()
    8. with(myTurtle) { //draw a 100 pix square
    9. penDown()
    10. for(i in 1..4) {
    11. forward(100.0)
    12. turn(90.0)
    13. }
    14. penUp()
    15. }

    Java 7’s try with resources

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

    需要泛型类型信息的泛型函数的简便形式

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

    消费一个可能为空的布尔值

    1. val b: Boolean? = ...
    2. if (b == true) {
    3. ...
    4. } else {
    5. // `b` is false or null