¿Por qué se eliminó el bucle indexado en Kotlin?

Sigo pensando que la forma "tradicional" de usar el bucle for es muy poderosa con control total del índice. ¿Por qué fue eliminado en Kotlin?

¿Qué debo hacer en kotlin con el siguiente código java

for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { .... 

La respuesta es: porque decidieron eliminarlo. Aún puedes usar esta syntax:

 for (a in 1..10) print("$a ") // >>> 1 2 3 4 5 6 7 8 9 10 for (a in 10 downTo 1 step 2) print("$a ") // >>> 10 8 6 4 2 

Para más información: Rangos y loops

No fue "eliminado". El layout de un nuevo idioma no comienza con el set de características de ningún idioma existente; comenzamos con un lenguaje que no tiene características, y comenzamos a agregar características que son necesarias para express cierto comportamiento de una manera agradable e idiomática. Hasta ahora, no tenemos conocimiento de ningún comportamiento para el cual un ciclo "para" de estilo C sea la manera más bonita e idiomática de expresslo.

Creo que la razón por la que lo hicieron de esa manera ("no eliminado") es porque querían que Kotlin fuera más expresivo.

Por ejemplo, en java podemos crear un bucle for como este:

 for(int x = 1; x < 10; x = x + 1) { System.out.print(x); } 

Todo lo que intenta hacer es eso, quiere imprimir valores del 1 al 10 , eso es todo. Así que Kotlin decidió traducir sus palabras en código y eliminar la verbosidad innecesaria.

 for (x in 1..10) print("$x") 

No fue eliminado. Es solo una syntax diferente para eso. El equivalente del código de Java:

 for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < n; j++) { 

Sería escrito en Kotlin de esta manera:

 val n = 10 for (i in 0..n-2) { for (j in i+1..n-1) { println("I'm low level for loop! I just look more friendly.") } } 

Kotlin usa ranges para definir iteradores de loops en aras de la brevedad del código.

No es necesario utilizar un bucle for tradicional en Kotlin, porque puede usar Kotlin lambdas para hacer que su código sea más expresivo y legible . por ejemplo:

 arrayOf(1, 2, 3).forEachIndexed { index, item -> /**TODO**/} 

Kotlin solo admite for-each loop, For for each loop acepta cualquier Iterable s / Array s / the type tiene un operador de iterator .

SI desea volver para usar la expresión de bucle for-each , puede escribir el código como se muestra a continuación, y puede ver que for-each loop tomará más código que lamda, esta es la razón por la cual la interfaz de secuencia de commands y funcional se introdujo en java -8 :

 val array = arrayOf(1, 2, 3) for(index in array.indices){ val item = array[index] // todo } 

SI necesita volver al bucle for tradicional, puede usar repeat lugar, por ejemplo:

 repeat(5){index-> /**TODO**/} 

Puede crear su propia function para realizar "bucle tradicional con control total del índice". O no tradicional. Por ejemplo, híbrido forEachIndexed() , with() , count() con el índice 1 para contar.

 inline fun <T> Iterable<T>.forWithIndexed1(action: T.(index: Int) -> Unit): Int { var index = 0 for (item in this) item.action(++index) return index } 

¿Por qué? El bucle "tradicional" es la causa de la exception de "índice fuera de límites" a diferencia del bucle de los elementos de la colección.