封闭lambda的隐式参数

Raj*_*Raj 4 lambda intellij-idea kotlin

val listPlans: List<Plan> = newPlans.mapTry {
            it.data.map {
                Plan(it.id, it.name, it.phone, it.desc, it.email)
            }.toList()
        }
Run Code Online (Sandbox Code Playgroud)

Kotlin新手在编写代码,而IntelliJ则突出显示该代码,Plan(it.id, it.name, it.phone, it.desc, it.email)并说封闭lambda的隐式参数已被遮盖。

可以保留原样吗?如果没有,我可以用什么代替它?

gli*_*isu 12

您已经嵌套了lambda,因此“ it”将表示最里面的lambda的隐式参数。此警告主要是出于可读性目的,并且避免了混淆,因为随着嵌套更多的lambda,“ it”的含义变得越来越不清楚。我建议您为嵌套的lambda明确指定lambda参数:

val listPlans: List<Plan> = newPlans.mapTry { plan ->
        plan.data.map {
            Plan(it.id, it.name, it.phone, it.desc, it.email)
        }.toList()
    }
Run Code Online (Sandbox Code Playgroud)

要么

val listPlans: List<Plan> = newPlans.mapTry {
        it.data.map { planData ->
            Plan(planData.id, planData.name, planData.phone, planData.desc, planData.email)
        }.toList()
    }
Run Code Online (Sandbox Code Playgroud)

或两者:

    val listPlans: List<Plan> = newPlans.mapTry { plan ->
        plan.data.map { planData ->
            Plan(planData.id, planData.name, planData.phone, planData.desc, planData.email)
        }.toList()
    }
Run Code Online (Sandbox Code Playgroud)

值得指出的是,这是JetBrains团队计划删除“ it”功能的原因之一。

  • 尽管kotlinlang链接很有趣,但大多数讨论是在5年前发布Kotlin 1.0之前进行的。JetBrains似乎不太可能曾认真考虑删除过“ it”,而且几乎可以肯定他们现在没有这样做。 (2认同)