Kotlin中的it

3 阅读2分钟

在Kotlin中,it 是用于简化单参数lambda表达式的隐式参数名。以下是其关键点和使用场景的总结:

1. 单参数lambda的隐式名称

  • 当lambda表达式‌仅有一个参数‌时,可省略参数声明,直接通过 it 引用该参数。

  • 示例‌:

    kotlinCopy Code
    listOf(1, 2, 3).map { it * 2 } // it指代列表中的每个元素
    strings.filter { it.length > 5 } // it的类型为String
    

‌2. 作用域函数中的it

  • letalso:将接收者对象作为lambda的参数,使用 it 访问。

    kotlinCopy Code
    val str = "Hello"
    str.let { println(it.length) } // it为str
    str.also { println(it.length) } // it为str
    
  • applyrun:使用 this 作为接收者(可省略),此时无需 it

    kotlinCopy Code
    str.apply { println(length) } // this为str,可省略
    

3.函数中的it

如果只有一个参数时,会隐式带一个参数it

/*
    如果只有一个参数时,会隐式带一个参数it
    fun methodAction2(it : String) : String { return "$it Test" }
 */
fun main(){

    val methodAction : (Int, Int, Int) -> String = { n1, n2, n3 ->
        val number = 24364
        println("$number Derry ,n1:$n1, n2:$n2, n3:$n3")
        "$number Derry ,n1:$n1, n2:$n2, n3:$n3"
    }
    // methodAction.invoke(1,2,3)
    methodAction(1,2,3)

    val methodAction2 : (String) -> String = { "$it Derry" }
    println(methodAction2("DDD"))

    val methodAction3 : (Double) -> String = { "$it Derry2" }
    println(methodAction3(5454.5))
}

‌4. 显式参数命名

  • 若需提高可读性或避免嵌套作用域冲突,可显式命名参数:

    kotlinCopy Code
    list.map { element -> element * 2 } // 显式命名
    
  • 嵌套lambda中的遮蔽问题‌:内部lambda的 it 会覆盖外部作用域的 it。需显式命名外层参数:

    kotlinCopy Code
    listOf(listOf(1, 2), listOf(3, 4)).map { outerList ->
      outerList.map { innerElement -> innerElement * 2 } // 显式命名避免混淆
    }
    

‌5. 类型推断

  • it 的类型由上下文自动推断。例如,处理 List<String> 时,it 的类型为 String

  • 若类型无法推断,需显式指定:

    kotlinCopy Code
    doSomething<String> { println(it.length) } // 指定泛型类型
    

‌6. 使用建议

  • 简洁操作‌:简单逻辑(如 it.name)使用 it 更简洁。
  • 复杂逻辑‌:在较长的lambda或嵌套结构中,推荐显式命名参数以提高可读性。

总结

it 是Kotlin的语法糖,用于简化单参数lambda的编写。合理使用可提升代码简洁性,但需注意作用域和可读性,尤其在嵌套场景中。