->和是什么?算术师在科特林意味着什么?

时间:2020-01-21 21:15:45

标签: java 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吗?

1 个答案:

答案 0 :(得分:1)

对于给定代码中到底发生了什么,或者将其转换为Java,没有足够的上下文来确定答案(如果有人不同意,请随时编辑此答案)。但是,您还会询问各种标识符和运算符,下面将对其进行说明。


it“特殊标识符”

请参见it: implicit name of a single parameter

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

如果编译器可以自己找出签名,则可以不声明唯一的参数,而省略->。参数将以名称it隐式声明:

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

Java等效项: N / A。


->运算符

  • 请参见Lambda expression syntax

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

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

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

    如果我们省略所有可选注释,那么剩下的看起来像这样:

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

    Java等效版本: lambda表达式。

  • Function types

    Kotlin将(Int) -> String之类的函数类型家族用于处理函数的声明:val onClick: () -> Unit = ....

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

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

    [...]

    Java等效项:不适用(最接近的等效项是“功能接口”)

  • When Expression

    when替换了C类语言的switch运算符。最简单的形式如下:

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

    [...]

    请参见grammar for when

    Java等效项(ish?)::切换表达式(Java 13的预览功能)


?”运算符

请注意,问题代码中的运算符实际上是?.,而不仅仅是?。参见Safe Calls

您的第二个选择是安全呼叫接线员,写为?.

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

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

安全调用在链中很有用。例如,如果可能将鲍勃(雇员)分配给一个部门(或不分配给某部门),从而又可能让另一名雇员作为部门负责人,那么要获得鲍勃的部门负责人的姓名(如果有),我们编写以下代码:

bob?.department?.head?.name

如果链中的任何属性为null,则该链返回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等效项: N / A。