En Java a veces escribo el código de la siguiente manera:
String obj = null; while ((obj = getObject()) != null) { // do smth with obj }En Kotlin se muestra un error en tiempo de compilación:
Las asignaciones no son expresiones y solo se permiten expresiones en este contexto
¿Cuál es el mejor equivalente en Kotlin?
Preferiría renunciar a la fantasía y hacerlo a la vieja escuela, que en cambio es más intuitiva.
var obj = getObject(); while (obj != null) { // do smth with obj obj = getObject(); }La solución ad-hock más simple es probablemente
while(true) { val obj = getObj() ?: break } Sin embargo, en mi opinión, los casos especiales se atienden mejor con funciones auxiliares especializadas. Por ejemplo, se puede leer un archivo línea por línea con un asistente readLines como se explica en una respuesta a una pregunta similar:
reader.forEachLine { println(it) }En los casos en que solo desea reemplazar while ((x = y.someFunction()) != null) , puede usar lo siguiente en su lugar:
generateSequence { y.someFunction() } .forEach { x -> /* what you did in your while */ } generateSequence le extraerá todos los valores uno por uno hasta que se alcance el primer null . Puede reemplazar .forEach con reduce o fold (o cualquier otra cosa que parezca apropiada ;-)) si desea mantener el último valor o sumar los valores a otra cosa.
Si necesita verificar algo más, puede agregar algo como takeIf , por ejemplo:
generateSequence { y.someFunction().takeIf { /* yourCondition... */ } }básicamente simplemente repitiendo lo que también mencioné aquí .