我正在处理字符串,遇到了Regex或Wildcard答案:可以将正则表达式放在带有覆盖等于的自定义类的when语句中。 虽然这确实有效地使用了类型系统来将语法语法添加到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)
}

结束语

我认为将arg传递给when并随后引用对arg类型进行操作的函数将更具可读性。 举一个人为的例子:

// 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开发人员会做什么?

  ask by Travis Well translate from so

本文未有回复,本站智能推荐:

4回复

功能python编程和条件

我正在尝试以功能方式编写python函数。 问题是我不知道,如何将if条件转换为函数式。 我有两个变量: A和C ,我想检查以下条件: 我看着lambda短路 ,但我无法让它工作。 我提前感谢你的帮助!
3回复

如何在 Kotlin 中的 compareBy 中有条件地反转列表

我有以下代码 然后我在像这样的列表上使用 myItems.sortedWith(sortMethod) 我喜欢这个解决方案,我认为它非常优雅。 但是,我想添加升序/降序排序的能力。 所以我问我如何向 sortMethod 添加条件.reverse() ? 我非常不愿意在我的每一个排序调用上都
1回复

如何重构嵌套的 switch-case (Java) 或 when (Kotlin)?

要求:我需要编写一个可以多人玩的 Jo-Ken-Pô 游戏。 有5个角色(SPOCK、剪刀、纸、石头和蜥蜴)。 我可以用这两个链接的 when/switches 来完成它(下面的代码使用 when() 因为它在 Kotlin 中,但同样的想法可以在 Java 中使用 switch 来应用) 我已
1回复

Kotlin 以及如何将 if/else 转换为函数式方法?

我有一个这种格式的函数: 我该如何更改它以使其具有更实用的方法? 我怀疑我应该能够使用一些函数值,因为如果检查两个 if/else 分支我也会这样做
2回复

从Kotlin中的lambda返回值的惯用方式

我有一个返回一些结果的函数,而且我还在测量该函数的运行时间: 如您所见,在运行函数runParallelTasks(chunksOfParallelTasks, task)我需要两个值: totalMillisPassed taskResults 如何在不求助于
3回复

Kotlin:为什么我不能在变量中存储函数?

为什么我必须使用函数引用将函数存储到变量中: 但我可以直接在变量中存储lambda:
1回复

Kotlin 中 Let 和 Use 函数的区别

我浏览了 Kotlin 的“let”和“use”方法的代码示例。 但是我无法弄清楚两个代码示例之间的任何区别以及它们用例之间的具体区别。 代码示例写在下面。 有人可以解释这两种方法及其用例之间的区别吗? 谢谢你。
2回复

为什么变量无法在内联函数中正确初始化,如在java中?

我们知道lambda体很懒 ,因为如果我们不调用lambda,就不会调用lambda体中的代码。 我们也知道在任何函数语言中变量都可以在函数/ lambda中使用,即使它没有被初始化,例如javascript,ruby,groovy和.etc,例如,下面的groovy代码可以正常工作: