在Kotlin中返回功能是否有一种不那么难看的方式?

Bas*_*ato 8 kotlin

这个声明有效,但不是最漂亮的代码.有没有办法让函数不那么难看?我试过(s: String) -> writer.println(s)但这没用.

val writeStuff: (PrintWriter) -> (String) -> Unit = {
    val writer = it
    val f: (String) -> Unit = {
        writer.println(it)
    }
    f
}
PrintWriter("test").use { writeStuff(it)("TEST") }
Run Code Online (Sandbox Code Playgroud)

编辑:更具体的例子:

val writeStuff: (PrintWriter) -> (String) -> Unit = { writer ->
    { writer.println(it) }
}

val sendStuff: (Any) -> (String) -> Unit = { sender ->
    { sender.equals(it) }
}

@Test fun test1() {
    val li = listOf("a", "b", "c")

    val process: List<(String) -> Unit> = 
        listOf(writeStuff(PrintWriter("a")), sendStuff(Object()))

    process.map { li.map(it) }
}
Run Code Online (Sandbox Code Playgroud)

hot*_*key 19

首先,您可以使用带有显式参数和内联的lambda语法来简化代码val f:

val writeStuff: (PrintWriter) -> (String) -> Unit = { writer -> 
    { writer.println(it) } 
}
Run Code Online (Sandbox Code Playgroud)

但是由于Kotlin支持本地函数声明,你甚至可以创建writeStuff一个本地fun而不是一个val.

这将导致以下代码:

fun writeStuff(writer: PrintWriter): (String) -> Unit {
    return { writer.println(it) }
}
Run Code Online (Sandbox Code Playgroud)

或者,使用单一表达式语法,

fun writeStuff(writer: PrintWriter): (String) -> Unit = { writer.println(it) }
Run Code Online (Sandbox Code Playgroud)

但是,用法将是相同的:

PrintWriter("...").use { writeStuff(it)("...") }
Run Code Online (Sandbox Code Playgroud)

  • 另请注意OP,如果将函数分配给val的目的是将其传递给另一个函数.这没有必要,因为您可以使用语法":: writeStuff"传递命名函数 (5认同)