我目前正在学习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吗?
答案 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表达式的完整语法形式如下:
val sum: (Int, Int) -> Int = { x: Int, y: Int -> x + y }
lambda表达式始终被花括号包围,完整语法格式的参数声明位于花括号内并具有可选的类型注释,主体位于
->
符号之后。如果lambda的推断返回类型不是Unit
,则lambda主体内的最后一个(或可能是单个)表达式将被视为返回值。如果我们省略所有可选注释,那么剩下的看起来像这样:
val sum = { x, y -> x + y }
Java等效版本: lambda表达式。
Kotlin将
(Int) -> String
之类的函数类型家族用于处理函数的声明:val onClick: () -> Unit = ....
这些类型具有与函数签名相对应的特殊符号,即它们的参数和返回值:
- 所有函数类型都有一个带括号的参数类型列表和一个返回类型:
(A, B) -> C
表示一种类型,该类型表示采用两个类型为A
和B
的参数并返回类型值的函数C
。参数类型列表可能为空,如() -> A
中所示。Unit
返回类型不能省略。[...]
Java等效项:不适用(最接近的等效项是“功能接口”)。
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。