Каков правильный способ использования сравнения "больше чем", "меньше" по сравнению с целыми числами с нулевым значением в Котлине?

var _age: Int? = 0

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

Это все еще дает мне ошибку с нулевой безопасностью, компиляция, но как я могу использовать > , <, >= или <= в этом вопросе?

Ответ 1

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 до того, как возраст будет назначен, вы получите исключение вместо нуля.

В любом случае, я считаю, что возраст = 0 - это какая-то магия, которая однажды может привести к проблемам (даже к проблеме).

Ответ 2

Я использовал нулевой коалесцирующий оператор для преобразования из nullable Int? до непустого значения Int:

var age: Int? = 0

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

Ответ 3

Kotlin может использовать для этого функцию расширения в Int, но пока они этого не сделают:

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

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

Мои методы возвращают false, а не null, если любой из операндов - null. Это имеет больше смысла для меня.