Как сделать композицию в Kotlin как операторы Groovy << и >> - PullRequest
0 голосов
/ 29 декабря 2018

Как я могу связывать / компоновать функции в Kotlin простым способом, например, в Groovy с оператором >>?Groovy синтаксис (см. http://groovy -lang.org / closures.html ):

def plus2  = { it + 2 }
def times3 = { it * 3 }

// composition
def times3plus2 = plus2 << times3
assert times3plus2(3) == 11
assert times3plus2(4) == plus2(times3(4))

// reverse composition
assert times3plus2(3) == (times3 >> plus2)(3)

Как сделать то же самое в Kotlin?

1 Ответ

0 голосов
/ 02 января 2019

В языке Kotlin нет такой встроенной функции, но вы можете создать функции расширения для лямбды, чтобы решить эту проблему:

/**
 * Extension function joins two functions, using the result of the first function as parameter
 * of the second one.
 */
infix fun <P1, R1, R2> ((P1) -> R1).then(f: (R1) -> R2): (P1) -> R2 {
    return { p1: P1 -> f(this(p1)) }
}

infix fun <R1, R2> (() -> R1).then(f: (R1) -> R2): () -> R2 {
    return { f(this()) }
}

/**
 * Extension function is the exact opposite of `then`, using the result of the second function
 * as parameter of the first one.
 */
infix fun <P1, R, P2> ((P1) -> R).compose(f: (P2) -> P1): (P2) -> R {
    return { p1: P2 -> this(f(p1)) }
}

Используя эти функции расширения, мы можем написать код на Kotlin, аналогичный вашему.:

val plus2: (Int) -> Int  = { it + 2 }
val times3: (Int) -> Int = { it * 3 }

// composition
val times3plus2 = plus2 compose times3
assert(times3plus2(3) == 11)
assert(times3plus2(4) == plus2(times3(4)))

// reverse composition
assert(times3plus2(3) == (times3 then plus2)(3))

PS: есть полезная библиотека, которая называется funKTionale , она имеет аналогичные функции расширения для составления функций - forwardCompose или и затем и составляют .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...