Kotlin: ¿Por qué no puedo hacer una tarea en un protector de bucle?

¿Por qué esta syntax no es válida? El error que informa IntelliJ es que solo se permiten expresiones en dicho context (línea 2). Me pregunto si hay alguna syntax para evitar esto, ya que Java permitió este tipo de asignación en la function de ciclo.

var c: Int; while ((c = reader.read()) != 1) { } 

La syntax no es válida, porque c = reader.read() no es una expresión en Kotlin, esto evita todos los == vs = errores.

Tienes que reescribirlo como:

 while (true) { val c = reader.read() if (c == 1) break ... } 

Nota: La otra respuesta explica el problema con su syntax, aquí hay una alternativa al uso del ciclo while.

Una gran ventaja de Kotlin es que puedes cambiar tu propio mundo para que sea exactamente como lo quieres. Así que creemos una function de extensión para hacer lo que básicamente está en las otras respuestas, pero haciéndola más atractiva.

Con esta function de extensión:

 inline fun Reader.readWhile(crossinline pnetworkingicate: (Int) -> Boolean): Sequence<Char> { return generateSequence { val c = this.read() if (c != -1 && pnetworkingicate(c)) { c.toChar() } else { null } } } 

Ahora puede simplemente:

 reader.readWhile { it != 1 }.forEach { // do something with each char } 

Y si quieres cerrar automáticamente el lector:

 reader.use { reader.readWhile { it != 1 }.forEach { // do something with each char } } 

Y, por supuesto, usted decide si la secuencia es de Char o Int según sus necesidades. Podrías crear tus propios useChars o forEachChar o lo que sea que haga que tu código sea como tú quieres. Consulte la Referencia de Kotlin API para kotlin.io para ver ejemplos de otras extensiones, especialmente en Reader para get ideas.

Prueba de unidad

Una testing unitaria para la function de extensión:

 @Test fun testSo32596261() { val reader = CharArrayReader(charArrayOf('A', 'B', 'C', 1.toChar(), 'D', 'E', 'F')) reader.use { assertEquals(listOf('A', 'B', 'C'), reader.readWhile { it != 1 }.toList()) } } 
  • ¿Cómo uso un onItemLongClickListener en mi actividad en Android?
  • Kotlin file para apk flujo de Android?
  • Clase de Android no encontrada Intermiten y se extienden a través del código
  • Las declaraciones de object de Powermockito spy y Kotlin: No se puede subclasificar la class final
  • RxJava Live Reactive Queue (con el interruptor de apagado)
  • ¿Puede Kotlin permitir una function que devuelva un valor del tipo de implementación de esta interfaz?
  • En Kotlin, ¿cómo integro una promise de Kovenant con las respuestas asincrónicas de Elasticsearch?
  • Broadcast Reciver en kotlin
  • Kotlin NoClassDefFoundError con el método @RequestMapping de spring
  • ¿Cómo crear caching / versión caliente de rx.Single?
  • NoSuchMethodError usando @Parcelize Annotation en Kotlin