kotlin - 使用 Kotlin WHEN 子句进行 <、<=、>=、> 比较

标签 kotlin

我正在尝试使用 WHEN带有 > 的子句或 <比较。

这不会编译。有没有办法在比较中使用一组普通的 bool 运算符(<<=、>=>)来启用它?

val foo = 2

// doesn't compile
when (foo) {
    > 0 -> doSomethingWhenPositive()
    0   -> doSomethingWhenZero()
    < 0 -> doSomethingWhenNegative()
}

我试图找到一个无限范围的比较,但也无法做到这一点?可以写成无限范围吗?

// trying to get an unbounded range - doesn't compile
when (foo) {
    in 1.. -> doSomethingWhenPositive()
    else -> doSomethingElse()
}

您可以将整个表达式放在第二部分,这可以,但似乎是不必要的重复。至少它可以编译和工作。

when {
    foo > 0 -> doSomethingWhenPositive()
    foo < 0 -> doSomethingWhenNegative()
    else -> doSomethingWhenZero()
}

但我不确定这是否比我们多年来一直使用的 if-else 替代方案更简单。比如:

if ( foo > 0 ) {
    doSomethingWhenPositive()
}
else if (foo < 0) {
    doSomethingWhenNegative()
}
else {
    doSomethingWhenZero()
}

当然,现实世界的问题比上面的要复杂,WHEN子句很有吸引力,但在这种类型的比较中并没有像我预期的那样起作用。

最佳答案

即使像 Kotlin 这样灵活的语言也没有针对每种情况的“优雅”/DRY 解决方案。

你可以这样写:

when (foo) {
    in 0 .. Int.MAX_VALUE -> doSomethingWhenPositive()
    0    -> doSomethingWhenZero()
    else -> doSomethingWhenNegative()
}

但是你依赖于变量类型。

我认为以下形式是 Kotlin 中最惯用的:

when {
    foo > 0  -> doSomethingWhenPositive()
    foo == 0 -> doSomethingWhenZero()
    else     -> doSomethingWhenNegative()
}

是的...有一些(最少的)代码重复。

一些语言(Ruby?!)试图为任何情况提供一种 super 优雅的形式 - 但有一个权衡:语言变得更复杂,程序员更难端到端地了解。

我的 2 美分...

关于kotlin - 使用 Kotlin WHEN 子句进行 <、<=、>=、> 比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45377386/

相关文章:

Android Gradle 几个模块 :transformDexArchiveWithDexMergerForDebug task fail

android - 最后几天我试图为我的回收站 View 添加 api 分页。但是我遇到了这样的问题

android - 如何在 BottomSheetDialog 上使用 View 绑定(bind)

kotlin - 通过 IntelliJ 运行 Google App Engine Standard 时出错 - 找不到 appengine-web.xml

junit - 将 kotlin 与 jmockit 一起使用

kotlin - 为什么属性初始化器不调用自定义 setter ?

kotlin - 将 `Pair`表示的新键值添加到 `MutableMap`

kotlin - 如何在伴侣对象中保留内部变量

java - Flink : Left joining a stream with a static list

android - 关于Flutter中的Gradle和Android平台