在 Kotlin 中对可空整数使用 "greater than"、"less than" 比较的正确方法是什么?

What is the right way of using "greater than", "less than" comparison on nullable integers in Kotlin?

var _age: Int? = 0

public var isAdult: Boolean? = false
   get() = _age?.compareTo(18) >= 0 

这仍然给我一个 null-safety 编译错误,但我如何在这件事上使用 >、<、>= 或 <=?

我使用空合并运算符从可为空的 Int 进行转换?到不可为 null 的 Int:

var age: Int? = 0

public var isAdult: Boolean? = null
   get() = if(age == null) null else (age ?: 0 >= 18)
var age : Int? = 0

public val isAdult : Boolean?
    get() = age?.let { it >= 18 }

另一个解决方案是使用委托:

var age : Int by Delegates.notNull()
public val isAdult : Boolean
    get () = age >= 18

因此,如果您在实际分配年龄之前尝试获取年龄或检查 isAdult,那么您将得到异常而不是 null。

无论如何,我相信 age = 0 是一种魔法,有一天可能会导致问题(甚至是产品问题)。

Kotlin 肯定可以为此在 Int 上使用扩展函数,但直到他们这样做:

fun Int?.isGreaterThan(other: Int?) =
    this != null && other != null && this > other

fun Int?.isLessThan(other: Int?) =
    this != null && other != null && this < other

我的方法 returns false,而不是 null 如果任一操作数是 null。这对我来说更有意义。

也可以试试这个:

var position = 100

    mArrayList?.let {

                if (it.size > 0 && position >= 0 ) 
                     return true

            }

您可以使用内置函数 compareValue:

fun <T : Comparable<*>> compareValues(a: T?, b: T?): Int
public var isAdult: Boolean = false
   get() = compareValues(_age, 18) >= 0

public var isAdult: Boolean = false
   get() = compareValues(18, _age) <= 0

但是请注意,null 被认为小于任何值,这可能适合您的情况,但在其他情况下可能会导致意外行为。例如,想想 var grantMinorsDiscount.

通用且灵活的解决方案是:

infix fun <T : Comparable<T>> T?.isGreaterThan(other: T?): Boolean? =
    if (this != null && other != null) this > other else null

infix fun <T : Comparable<T>> T?.isGreaterThanOrEqual(other: T?): Boolean? =
    if (this != null && other != null) this >= other else null

infix fun <T : Comparable<T>> T?.isLessThan(other: T?): Boolean? =
    if (this != null && other != null) this < other else null

infix fun <T : Comparable<T>> T?.isLessThanOrEqual(other: T?): Boolean? =
    if (this != null && other != null) this <= other else null

根据您的需要,您可以将其用作:

public var isAdult: Boolean? = false
    get() = _age isGreaterThanOrEqual 18

或:

public var isAdult: Boolean = false
    get() = _age isGreaterThanOrEqual 18 == true

编辑:现已在 kotlin-lib 中可用。