最近用 kotlin
写业务代码,福至心灵的又优化了一个写法,同时也再次加深了return
的一个小技巧。
再感慨一句:kotlin
真香...
假如我有一个这样的代码,你觉得在 forEache
里面的 return
退出的是forEach
还是这个方法?
fun validateNum(strList: List<String>) {
strList.forEach {
if (it.length > 1)
//注意这里
return
}
doSomeOthers()
}
如果你尝试执行下,那么久可以发现,当前的写法,return
是退出整个方法,假如你要退出这个forEach
你需要怎么写了?
fun validateNum(strList: List<String>) {
strList.forEach {
if (it.length > 1)
//注意这里
return@forEach
}
doSomeOthers()
}
核心的就是return@forEach
,注明清楚返回的是@forEach
这个循环
比如这个方法就是解析出json
中的userId
fun mtRegister(ctx: ChannelHandlerContext, body: TransferInfo) {
val userId = parseToken(body).let {
if (it.first.isNotBlank()) {
log.error("解析token失败...")
return //return 直接退出
} else {
it.second.toLong()
}
}
}
接收方法体就是类似上面的写法,这样可以直接获取到 userId
的值,我们简单分析下几个场景
let
的目的是为了减少一个局部变量的声明,假如我不用let
代码需声明一个局部参数uIdTuple2
,但是该变量只是一个为了uId
的过渡变量
最少知道
原则以及避免后续可能错误使用该变量的考虑着想,用let
岂不更好。 fun mtRegister(ctx: ChannelHandlerContext, body: TransferInfo) {
val uIdTuple2 = parseToken(body)
val userId = if (uIdTuple2.first.isNotBlank()) {
log.error("解析${uIdTuple2}失败...")
return
} else {
uIdTuple2.second.toLong()
}
}
}
方便阅读,这里再贴下代码:
fun mtRegister(ctx: ChannelHandlerContext, body: TransferInfo) {
val userId = parseToken(body).let {
if (it.first.isNotBlank()) {
log.error("解析token失败...")
return //return 直接退出
} else {
it.second.toLong()
}
}
}
这里的return
退出也是kotlin
支持的用法,在判定的过程中,就发现了终止条件,那么退出。
可能传统的Java
程序员会纳闷不是外层还有一个userId
在接收吗?其实在该情况下 userId
根本不会有值,同时后续的代码也不会执行。
你注意最后一行 it.second.toLong()
,这个可是没有return
的,kotlin 会自动帮我们默认为该表达式最内层的方法
的返回值。
假如你要强行写 return
,那么就需要注意了,return
的范围了,因为此时可是又 2 层 方法的
mtRegister
let
所以,如果在当前情形下,你需要这么写:
return@let it.second.toLong()
通过@method
来表明你退出的是哪个方法...
这个也是最近在使用kotlin
的时候,发现的一些小技巧,这里简单记录下...