Me estoy poniendo
java.lang.NullPointerException: intento de invocar virtual método 'float java.lang.Number.floatValue ()' en una referencia de objeto nulo
el siguiente código:
val localHistory: ArrayList<Float> = ArrayList<Float>()
...
val strHistory = localHistory.map { value -> decoration.decoratedValue(ref.format, value) }
Me acabo de enterar de que ArrayList puede contener valores nulos (Oookay). Eso significaría que el valor en el mapa de cierre de transformación puede ser NULL, no?
Pero esto no puede ser ya que el valor no es un tipo opcional y el compilador dice que si (valor! = Null) será siempre verdad.
Así que la pregunta es cómo evitar la NPE en este caso?
Sugiero que marcar cada parámetro en un Collection
recibes de Java como anulable (a menos que, por supuesto, usted sabe que nunca puede ser null
:
val floats: List<Float?> = someJavaClass.getFloats()
A continuación, puede filtrar la null
s y hacer su operación mapa:
val newFloats: List<Float> = floats
.filter { it != null }
.map { it + 1 }
Tenga en cuenta que cada filter
, map
operación (y así sucesivamente) se repetirá toda la colección y crear una nueva en cada vez. Usted es mejor de utilizar Sequence
s, que son iterados con pereza.
Como se mencionó en los comentarios se puede utilizar filterNotNull
para filtrar directamente todos los valores nulos:
val newFloats: List<Float> = floats
.filterNotNull()
.map { it + 1 }
Y mapNotNull
sólo para mantener los valores que mapean-función no devuelve null
, esto también elimina la filterNotNull
:
val newFloats: List<Float> = floats
.mapNotNull { it?.plus(1) }
Otra construcción que puedo pensar que trabaja con su ejemplo, a pesar de que es muy díficil de leer y solo complejo. Pero aquí está:
val strHistory = localHistory
.mapNotNull { decoration.decoratedValue(ref.format, it ?: return@mapNotNull null) }