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吗?
解决方案
至于给定代码中到底发生了什么,或者将其转换为 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
表示一个表示函数的类型,该函数接受两个类型的参数A
并B
返回一个类型的值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 等效项:不适用。
推荐阅读
- npoi - NPOI 版本 2.2+ MemoryStream.ToArray() 0 字节
- python - 函数“im2uint8”(在 MATLAB 中)和“bytescale”(在 Python 中)之间的区别
- asp.net-core-mvc - 为 ASP.NET Core MVC 2.1 网站加载更多按钮
- java - 滚动多个 JPanel Java 的列表
- python - 如何在 Python 中生成递归函数
- c - 添加while循环时出现分段错误
- api - 应用程序接口管道代码
- c++ - 在 Qt ActiveX 中断言“id < 0”失败
- apache-spark - 如果在主键约束中给出了多个列,如何在 spark-jdbc 中读取表时对数据进行分区?
- python - 使用 nightrain 的 webapp 到桌面转换问题