Каков наиболее краткий способ включить функции или лямбды в качестве условий в оператор Kotlin `when` (или другую ветвящуюся конструкцию)? - PullRequest
2 голосов
/ 19 сентября 2019

Я обрабатываю строки, и я наткнулся на ответ Regex или Wildcard : можно поместить регулярные выражения в оператор when с помощью пользовательского класса, который переопределяет equals.Хотя это эффективно использует систему типов для добавления синтаксического сахара в оператор when, я нахожу следующее довольно уродливым и никогда не сделаю этого в коде, которым я намерен поделиться с другим разработчиком (цитируя travis ):

import kotlin.text.regex

when (RegexWhenArgument(uri)) {
    Regex(/* pattern */) -> /* do stuff */
    Regex(/* pattern */) -> /* do stuff */
    /* etc */
}

Где RegexWhenArgument минимально определен как:

class RegexWhenArgument (val whenArgument: CharSequence) {
    operator fun equals(whenEntry: Regex) = whenEntry.matches(whenArgument)
    override operator fun equals(whenEntry: Any?) = (whenArgument == whenEntry)
}

( конец кавычки )

Я думаю, это было бы намного большечитаемый, чтобы передать аргумент when и затем ссылочные функции, которые работают с типом аргумента.Для надуманного примера:

// local declaration
val startsWithFn: (String) -> Boolean = {s -> s.startsWith("fn:")}

when(givenString) {
    ::startsWithHelp -> printHelp()
    startsWithFn -> println("Hello, ${givenString.substring(3)}!")
}

// package level function
fun startsWithHelp(s:String) = s.startsWith("help", true)

Но, конечно, этот код не компилируется.Есть ли способ сделать это читабельным, понятным и лаконичным?Может быть, с помощью потоков?Что бы сделал опытный разработчик Kotlin?

...