为什么在Kotlin中删除了循环索引?

我仍然认为使用for循环的“传统”方法是非常强大的,并且完全控制索引。 为什么在Kotlin中删除?

我应该怎么做在kotlin下面的java代码

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

答案是:因为他们决定删除它。 你仍然可以使用这个语法:

 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 

欲了解更多信息: 范围和循环

它没有被“删除”。 新语言的设计不是从任何现有语言的特征集开始的; 我们从一个没有特征的语言开始,并且以一种很好和惯用的方式开始添加必要的特征来表达某些行为。 到目前为止,我们还没有意识到任何一种C风格的for循环将成为最好,最习惯的表达方式。

我认为他们之所以这么做,是因为他们想让Kotlin更具表现力。

例如,在Java中,我们可以像这样创建一个for循环:

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

所有你想要做的是,你想打印出1到10的值,就是这样。 所以Kotlin决定把你的文字翻译成代码并删除不必要的冗长。

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

它没有被删除。 它只是不同的语法。 Java代码的等价物:

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

将这样写在Kotlin:

 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使用范围来定义循环的迭代器。

您可以创建自己的功能来实现“索引完全控制的传统循环”。 或者非传统。 例如,混合forEachIndexed()with()count()索引1来计数。

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

在Kotlin中不需要使用传统的for循环,因为您可以使用Kotlin lambda来使您的代码更具表现力可读性 。 例如:

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

Kotlin只支持for-each循环, for-each循环接受任何可iterator s / Array s /类型有一个iterator操作符。

如果你想回到使用for-each循环表达式,你可以编写如下的代码,你可以看到for-each循环将比lamda更多的代码,这就是为什么在java中引入了stream api和functional interface -8 :

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

如果你需要回到传统for循环,你可以使用repeat ,例如:

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

为什么? “传统”循环是“索引越界”异常的原因,与收集项目上的循环不同。