Как сравнить значение с несколькими другими значениями в одной строке в Kotlin - PullRequest
4 голосов
/ 12 февраля 2020

Есть ли лучшая альтернатива этому выражению в Kotlin: a == b || a == c

Я ищу что-то вроде a == b || c или a.equals(b, c)

Ответы [ 4 ]

6 голосов
/ 12 февраля 2020

Я думаю, что самый простой способ с оператором in:

a in listOf(b, c)

Вы можете включить в список столько элементов, сколько хотите.

5 голосов
/ 12 февраля 2020

Вы можете использовать when как

when(a){
    b,c -> println("match") // match either b or c
    else -> println("no match") // in case of no match
}

Кроме того, вы можете использовать in с диапазоном как

when(number){
    100,200 -> println(" 100 or 200 ")
    in 1..5 -> println("in range") // between 1 - 5
    !in 6..10 -> println("not in range") // not between 6 - 10
    else -> println("no match")
}

Вы также можете использовать несколько пользовательских значений enum как

// often used to represent API/process status etc
when(Status.ERROR){
    in listOf(Status.ERROR, Status.EXCEPTION) -> println("Something when wrong") 
    else -> println("Success")
}

enum class Status{
    SUCCESS, ERROR, EXCEPTION
}
1 голос
/ 12 февраля 2020

Другой вариант (который я лично предпочитаю) - создать функцию расширения:

fun Any.equalsAny(vararg values: Any): Boolean {
    return this in values
}

Пример использования:

val result1 =  20.equalsAny(10, 20, 30)               // Returns true
val result2 =  "ABC".equalsAny(10, 20, 30, 99 , 178)  // Returns false
val result3 =  "ABC".equalsAny("ABC", "XYD", "123")   // Returns true
val result4 =  "ABC".equalsAny("xxx", "XYD", "123")   // Returns false

Вы можете даже смешивать типы, и это прекрасно работает:

val a = 1
val b = "10"
val c = true
val search = 999
val search2 = false
val result5 = search.equalsAny(a, b, c)               // Returns false
val result6 = search2.equalsAny(a, b, c, 872, false)  // Returns true
1 голос
/ 12 февраля 2020

Вы можете поместить значения в список и использовать any:

listOf(b, c).any { it == a }

Это особенно удобно, если у вас есть много значений для сравнения.


На всякий случай, если вам это нужно и для:

a == b && a == c будет переводиться на listOf(b, c).all { it == a }

...