kotlin lambda及dsl

176 阅读1分钟

函数

在kotlin中 函数可作为参数传递

fun a(p:()->Int) = p()

//方式1
fun b():Int { return 1 }
a(::b)
//方式2
a(fun() { return 1 })

两种方式都把函数作为对象处理

lambda

简化

fun a(p:(Int) -> Int) {}

a {
    it+1
}

对于

fun a(p:(Int) -> Int){}

匿名函数fun(a:Int){ return a+1 }可以简化为{ it+1 }
即调用时

a({ it+1 })

当lambda表达式为函数最后一项实参时,可以移动至括号外

a{ it+1 }

DSL

由kotlin的语法特性,可以很轻松地构建DSL(领域特定语言)

gradle

class Dependency {
    var libs = mutableListOf<String>()
    fun implementation(lib: String) {
        libs.add(lib)
    }
}
fun dependencies(block: Dependency.() -> Unit): List<String> {
    val dependency = Dependency()
    dependency.apply(block)
    return dependency.libs
}

调用

dependencies {
    implementation("org.jetbrains.kotlinx:kotlinx-serialization-json")
    implementation("androidx.navigation:navigation-compose")
}

一些示例

buildMessage {
    "sombodyA" says "hello" at 16
    "sombodyB" says {
        +picture("a.jpg")
        +"pic here"
    } 
}

HTML

html {
    body {
        div {
            a("https://kotlinlang.org") {
                target = ATarget.blank
                +"Main site"
            }
        }
    }