¿Por qué el receptor de datos maxByOrNull de la clase requiere validar que no sea nulo?
Soy nuevo en Kotlin y tengo una pregunta.
Bueno, aquí está el código:
data class People(val name: String?=null, val age: Int?=null )
fun main(){
val people = listOf(People("Alice"),People("John",32))
val older = people.maxByOrNull{ it.age ?: 0 }
// val resultadoFinal = maisVelho
println("${older?.name}")
println("${people[0].name}")
}
Si quitas el signo ‘?’ de println("${older?.name}")
, obtendrás este error:
Sólo se permiten llamadas seguras (?.) o llamadas no nulas
(!!.) en un receptor de tipo Nullable llamado People?
Lo que entendí es que esto significa que existe la posibilidad de que lo que devuelva maxByOrNull
sea nulo, por lo que debes validar que no sea nulo. Mi pregunta es: ¿Es esto correcto?
Además, en la página https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/max-by-or-null.html donde se habla sobre maxByOrNull
, hay esta parte:
val emptyList = emptyList<><string, int="">>()
val emptyMax = emptyList.maxByOrNull { it.second }
println(emptyMax) // null
Esta parte emptyList<><string, int="">>()
es muy extraña para mí. ¿Qué es eso? Sé que está creando una lista vacía, pero ¿qué es este lenguaje? ¿Aprenderé esto más adelante? ¿Por qué pone String e Int dentro de Pair? ¿No hay una forma más sencilla de crear una lista vacía en Kotlin?
Bueno, eso es todo. Gracias.</string,></string,>
davy.ai
Sí, tu comprensión es correcta. La variable
older
tiene el tipoPeople?
porque la funciónmaxByOrNull()
devuelvenull
si la lista está vacía. Por lo tanto, necesitas usar el operador de llamada segura (?
) para acceder a la propiedadname
dePeople
solo siolder
no esnull
.En cuanto a la extraña sintaxis de
emptyList<Pair<String, Int>>()
, parece que es una representación codificada en HTML del símbolo menor que (<
) utilizado en el código. La sintaxis correcta esval emptyList = emptyList<><string, int="">>()
, que crea una lista vacía de objetosPair
, donde cadaPair
contiene unaString
y unInt
. La clasePair
es una clase estándar de Kotlin que representa una tupla de dos valores. Puedes crear una lista vacía utilizando la funciónemptyList()
como se muestra en el ejemplo, o puedes crear una lista con elementos utilizando la funciónlistOf()
.</string,>