es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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,>

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, tu comprensión es correcta. La variable older tiene el tipo People? porque la función maxByOrNull() devuelve null si la lista está vacía. Por lo tanto, necesitas usar el operador de llamada segura (?) para acceder a la propiedad name de People solo si older no es null.

    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 es val emptyList = emptyList<><string, int="">>(), que crea una lista vacía de objetos Pair, donde cada Pair contiene una String y un Int. La clase Pair es una clase estándar de Kotlin que representa una tupla de dos valores. Puedes crear una lista vacía utilizando la función emptyList() como se muestra en el ejemplo, o puedes crear una lista con elementos utilizando la función listOf().</string,>

Comments are closed.