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

王子1*_*986 17 for-loop kotlin

我仍然认为使用for循环的"传统"方式非常强大,可以完全控制索引.为什么在Kotlin中删除它?

我应该如何在kotlin中使用以下java代码

for (int i = 0; i < n - 1; i++) {
   for (int j = i + 1; j < n; j++) {
   ....
Run Code Online (Sandbox Code Playgroud)

yol*_*ole 26

它没有被"删除".新语言的设计不是从任何现有语言的特征集开始; 我们从一种没有功能的语言开始,然后开始添加以一种不错的惯用方式表达某些行为所必需的功能.到目前为止,我们还没有意识到C风格的"for"循环是表达它的最好和最惯用的方式的任何行为.

  • 但是,C风格的“ for”循环具有简单的一致语法,可用于任何事物。使用Kotlin,您可以将这个简单的概念分解为许多不同的概念。这是我不喜欢这种语言的极少数事情之一。 (3认同)
  • 另外,如果你想使用浮点变量进行迭代怎么办?祝你好运。我必须重新发明传统的 for 循环,因为 kotlin 范围和级数不包括浮点类型。我认为在没有真正考虑所有用例的血统替换的情况下删除传统的 for 是 kotlin 团队的越权行为。 (3认同)
  • 索引 for 循环的优点之一是:处理序列,无论出于何种原因,您都会跳过 N 个其他元素。例如:解析 CLI 参数。使用索引 for 循环,您可以只使用“i += N”。 (2认同)

Ale*_*nov 18

答案是:因为他们决定将其删除.您仍然可以使用以下语法:

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 
Run Code Online (Sandbox Code Playgroud)

有关更多信息:范围循环

  • 嗨,OP问**为什么**传统的循环在Kotlin被删除而不是**怎么**? (5认同)

Alf*_*Moh 6

我认为他们这样做的原因("没有删除")是因为,他们想让Kotlin更具表现力.

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

for(int x = 1; x <= 10; x++) {
   System.out.print(x);
}
Run Code Online (Sandbox Code Playgroud)

你要做的就是,你想要打印出1到10之间的值,就是这样.因此,Kotlin决定将您的单词翻译成代码并删除不必要的详细程度.

for (x in 1..10) print("$x") 
Run Code Online (Sandbox Code Playgroud)

  • 您的两个摘要将在Kotlin中用Java打印不同的值。Kotlin示例不正确 (2认同)

Dar*_*nus 5

将这些索引保留为白色的另一种有用的迭代方法(即Iterable)是使用withIndex()方法。例如:

for((i, element) in myIterable.withIndex()){
    //do something with your element and the now known index, i
}
Run Code Online (Sandbox Code Playgroud)

我注意到该功能与答案中所建议的功能相同,但我认为最好是使用Iterables在此类情况下已经内置的方法,而不是再次实现它们。我们可以说这也类似于forEachIndexed{}lambda:

myIterable.forEachIndexed{i, element ->
    //do something here as well
}
Run Code Online (Sandbox Code Playgroud)