Kotlin 使用'将值与两个值进行比较;或';操作人员

Kotlin 使用'将值与两个值进行比较;或';操作人员,kotlin,Kotlin,我有一个简单的if()条件,需要检查值是1还是2(例如)。假设我们比较的价值不是“简单的”: if(it.first().property.value == 1 || it.first().property.value == 2) { // Do stuff } 是否有更好的方法执行此检查(无需键入整个表达式以获得两次实际值)?我唯一想到的是 if(listOf(1, 2).contains(it.first().property.value)) { // Do stuff }

我有一个简单的
if()
条件,需要检查值是
1
还是
2
(例如)。假设我们比较的价值不是“简单的”:

if(it.first().property.value == 1 || it.first().property.value == 2) {
    // Do stuff
}
是否有更好的方法执行此检查(无需键入整个表达式以获得两次实际值)?我唯一想到的是

if(listOf(1, 2).contains(it.first().property.value)) {
    // Do stuff
} 

但是我担心它会占用更多内存,因为它引入了额外的
列表。

您可以在
it
类型上定义一个扩展函数,使其更具可读性:

if(it.isOneOrTwo()){
//做事
}
不确定您的
it
的类型,请相应地替换
TYPEOFIT

private inline fun TYPEOFIT.isOneOrTwo()=first().property.value==1 | | first().property.value==2
要进一步改善状况,您可以在
时利用

private inline fun TYPEOFIT.isOneOrTwo()=when(first().property.value){
1,2->true
else->false
}

您可以在
it
类型上定义一个扩展函数,使其更具可读性:

if(it.isOneOrTwo()){
//做事
}
不确定您的
it
的类型,请相应地替换
TYPEOFIT

private inline fun TYPEOFIT.isOneOrTwo()=first().property.value==1 | | first().property.value==2
要进一步改善状况,您可以在
时利用

private inline fun TYPEOFIT.isOneOrTwo()=when(first().property.value){
1,2->true
else->false
}

您可以使用
表达式时确定它,如本例所示:

fun main() {
    val number = 22

    when (number) {
        1, 2 -> println("${number} is 1 or 2")
        in 10..20 -> println("${number} is between 10 and 20 (inclusively)")
        else -> println("${number} is either negative, equals 0, 3, 4, 5, 6, 7, 8, 9, 21 or any number above")
    }
}
这里的输出是

22为负数,等于0、3、4、5、6、7、8、9、21或以上任何数字

您可以使用
表达式时确定它,如本例所示:

fun main() {
    val number = 22

    when (number) {
        1, 2 -> println("${number} is 1 or 2")
        in 10..20 -> println("${number} is between 10 and 20 (inclusively)")
        else -> println("${number} is either negative, equals 0, 3, 4, 5, 6, 7, 8, 9, 21 or any number above")
    }
}
这里的输出是

22为负数,等于0、3、4、5、6、7、8、9、21或以上任何数字

您的最后一个建议总体上是好的,不过通常最好使用预定义的列表(以及
中的
操作符):

它只分配列表一次,性能和其他选项一样好,而且可读性强,通用性强

(如果列表不能自然地放入命名属性中,您必须判断可能需要的频率,以便与直接将其放入条件中的简洁性进行比较,从而获得较小的性能优势。)

事实上,因为您正在寻找连续整数,所以对于这个特定测试有一个更简洁的选项:

if (it.first().property.value in 1..2)
    // Do stuff
只要可接受的值形成一个(不间断的)范围,这将起作用

或者,如果始终只检查两个值,则可以编写一个简单的扩展函数:

fun <T> T.isEither(a: T, b: T) = this == a || this == b
funt T.isEither(a:T,b:T)=this==a | | this==b

(您可以使用
vararg
param编写一个更通用的数组,但每次都会创建一个数组-非常类似于我们开始的listOf()
案例中的

您的最后一个建议总体上是一个好建议,不过通常最好使用预定义的列表(以及
in
操作符):

它只分配列表一次,性能和其他选项一样好,而且可读性强,通用性强

(如果列表不能自然地放入命名属性中,您必须判断可能需要的频率,以便与直接将其放入条件中的简洁性进行比较,从而获得较小的性能优势。)

事实上,因为您正在寻找连续整数,所以对于这个特定测试有一个更简洁的选项:

if (it.first().property.value in 1..2)
    // Do stuff
只要可接受的值形成一个(不间断的)范围,这将起作用

或者,如果始终只检查两个值,则可以编写一个简单的扩展函数:

fun <T> T.isEither(a: T, b: T) = this == a || this == b
funt T.isEither(a:T,b:T)=this==a | | this==b

(您可以使用
vararg
param编写一个更通用的数组,但每次都会创建一个数组-非常类似于我们开始使用的listOf()
案例中的

关于
何时(it.first().property.value)
?你试过了吗?我真的希望它是一个线性函数,因为我经常在.takeIf{}表达式中使用它,它通常是更大表达式的一部分。
it
的类型是什么?然后按照@JakubZalas的建议做:编写一个扩展函数并使用它…当(it.first().property.value)
时,
怎么办?你试过了吗?我真的希望它是一行,因为我经常在.takeIf{}表达式中使用它,它通常是更大表达式的一部分。它的类型是什么?
?然后按照@JakubZalas的建议做:编写一个扩展函数并使用它…谢谢你的回答。既然引入了一个新功能,这会不会占用更多的资源呢?这充其量只是一种微观优化。我更担心的是可读性,而不是假设的开销,这无论如何都可以忽略不计。你真的测量了性能吗?我相信编译器可以很好地完成它的工作,并内联私有函数。您实际上也可以将其标记为内联。@Webfreak内联函数在编译时在调用站点内联。谢谢您的回答。既然引入了一个新功能,这会不会占用更多的资源呢?这充其量只是一种微观优化。我更担心的是可读性,而不是假设的开销,这无论如何都可以忽略不计。你真的测量了性能吗?我相信编译器可以很好地完成它的工作,并内联私有函数。实际上,您也可以将其标记为内联。@Webfreak内联函数在编译时在调用站点内联。使用in非常好。这就是我现在所需要的。谢谢凉的但是@deHaar在
时提出的
建议也值得考虑:-)在