【问题标题】:Nested forEach, How to distinguish between inner and outer loop parameters?嵌套forEach,如何区分内循环参数和外循环参数?
【发布时间】:2017-12-25 12:24:30
【问题描述】:

在 Kotlin 中,如果要使用 forEach 的元素,可以使用 it 关键字。所以现在我想知道如果我在forEach 里面有一个forEach 应该怎么办:

list.forEach {
    val parent = it
    it.forEach {
        // `it` now become the element of the parent.
    }
}

我认为只为命名约定定义一个新变量太愚蠢了。这个问题还有其他解决方案吗?

【问题讨论】:

  • 到底是什么问题?
  • list.forEach{ println(it) }list.forEach{ it -> println(it) } 的简写,因此您可以使用任何您想要的名称。不过,我认为使用速记并没有什么坏处。
  • @AluanHaddad 谢谢你的建议。

标签: foreach kotlin


【解决方案1】:

it 只是所有单参数闭包中的默认参数名称。您可以自己指定参数名称:

collection.forEach { customName -> 
    ...
}

【讨论】:

  • 如此简单却又如此艰难。感谢您的解决方案!
  • 完美!哇哈哈
【解决方案2】:

除了上面Artyom的正确答案之外,我想说的是,如果您只关心内部它,您可以简单地忽略名称重载。

见:

>>  var a = "abc"
>>  a?.let { it[2]?.let { it } }
c

返回的值是最内在的“它”。这里的“it”指的是最外层的“it[2]”,即字符串“abc”中的字符“c”。

现在,如果你想访问最外层的“它”,你应该像 Artyom 所说的那样给它命名。下面的代码等价于上面的代码,但是如果你需要的话,它允许你从最里面的'let'块中的外部'let'块中引用“outerIt”。

>>  var a = "abc"
>>  a?.let { outerIt -> outerIt[2]?.let { it } }
c

这样,如果你需要引用最外层的它,你可以。例如:

>>  var a = "abc"
>>  a?.let { outerIt -> outerIt[2]?.let { "${outerIt[1]} $it" } }
b c

如果您不需要引用最外面的“它”,我个人更喜欢第一个构造,因为它更简洁。

【讨论】:

    猜你喜欢
    • 2015-07-17
    • 2018-07-15
    • 2015-07-15
    • 2021-08-06
    • 2012-03-29
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多