首页 > 解决方案 > -> 和 是什么?运算符在 Kotlin 中是什么意思?

问题描述

我目前正在学习 java 并试图理解 Kotlin 代码,但我不明白这个表达式代表什么:

a == a -> file?.let { 
    createDataSource("aaa.xml", it)
}


 createDataSource(filename: String, outfile: File) {
     ...
     ObjectOutputStream(FileOutputStream(outfile)).use {
          it -> it.wroteObject(map)
      }}

这是某种 lambda 表达式吗?这是什么意思?运算符 '->' 和 '?' 是什么意思?意思是?有人可以帮我把它翻译成java吗?

标签: javakotlin

解决方案


至于给定代码中到底发生了什么,或者将其转换为 Java,没有足够的上下文来给出一个自信的答案(如果有人认为不同,请随时编辑这个答案)。但是,您还会询问各种标识符和运算符,这些将在下面进行解释。


it“特殊标识符”

看到它:单个参数的隐式名称

一个 lambda 表达式只有一个参数是很常见的。

如果编译器可以自己计算出签名,则允许不声明唯一参数并省略->。该参数将在 name 下隐式声明it

ints.filter { it > 0 } // this literal is of type '(it: Int) -> Boolean'

Java 等效项:不适用。


->操作员

  • 请参阅Lambda 表达式语法

    lambda 表达式的完整语法形式如下:

    val sum: (Int, Int) -> Int = { x: Int, y: Int -> x + y }
    

    lambda 表达式总是被花括号包围,完整语法形式的参数声明位于花括号内并具有可选的类型注释,主体位于->符号之后。如果推断的 lambda 的返回类型不是Unit,则 lambda 主体内的最后一个(或可能是单个)表达式被视为返回值。

    如果我们把所有可选的注释都去掉,剩下的看起来像这样:

    val sum = { x, y -> x + y }
    

    Java 等价物(ish): lambda 表达式。

  • 功能类型

    Kotlin 使用一系列函数类型,例如(Int) -> String处理函数的声明:val onClick: () -> Unit = ....

    这些类型具有对应于函数签名的特殊符号,即它们的参数和返回值:

    • 所有函数类型都有一个带括号的参数类型列表和一个返回类型:(A, B) -> C表示一个表示函数的类型,该函数接受两个类型的参数AB返回一个类型的值C。参数类型列表可能为空,如() -> A. Unit返回类型不能省略。

    [...]

    Java 等效项: N/A (最接近的等效项是“功能接口”)

  • 当表达式

    when替换类 C 语言的 switch 运算符。在最简单的形式中,它看起来像这样:

    when (x) {
        1 -> print("x == 1")
        2 -> print("x == 2")
        else -> { // Note the block
            print("x is neither 1 nor 2")
        }
    }
    

    [...]

    请参阅 的语法when

    Java 等价物(ish?): switch 表达式(Java 13 的预览功能)


" ?" 运算符

请注意,您问题中代码中的运算符实际上是?.,而不仅仅是?. 请参阅安全通话

您的第二个选择是安全呼叫操作员,写成?.

val a = "Kotlin"
val b: String? = null
println(b?.length)
println(a?.length) // Unnecessary safe call

b.length如果b不为空,则返回,null否则返回。这个表达式的类型是Int?

安全调用在链中很有用。例如,如果员工 Bob 可能被分配到一个部门(或没有),而该部门又可能有另一个员工作为部门负责人,那么要获取 Bob 的部门负责人的姓名(如果有),我们编写以下内容:

bob?.department?.head?.name

null如果其中的任何属性为空,则此类链返回。

要仅对非空值执行特定操作,您可以将安全调用运算符与let

val listWithNulls: List<String?> = listOf("Kotlin", null)
for (item in listWithNulls) {
   item?.let { println(it) } // prints Kotlin and ignores null
}

安全呼叫也可以放在作业的左侧。然后,如果安全调用链中的接收者之一为空,则跳过赋值,并且根本不计算右侧的表达式:

// If either `person` or `person.department` is null, the function is not called:
person?.department?.head = managersPool.getManager()

Java 等效项:不适用。


推荐阅读