在 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 中可用。
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 中可用。