Kotlin 科特林:我可以使用封闭的合格返回吗?
我想记录并返回供应商提供的空值 如果不记录日志,这可以正常工作:Kotlin 科特林:我可以使用封闭的合格返回吗?,kotlin,closures,elvis-operator,Kotlin,Closures,Elvis Operator,我想记录并返回供应商提供的空值 如果不记录日志,这可以正常工作: fun check_plain(supplier: Supplier<String?>) { val arg: String = supplier.get() ?: return // do checking } fun check\u plain(供应商:供应商){ val arg:String=supplier.get()?:返回 //检查 } 但是,如果我也在e
fun check_plain(supplier: Supplier<String?>) {
val arg: String = supplier.get() ?: return
// do checking
}
fun check\u plain(供应商:供应商){
val arg:String=supplier.get()?:返回
//检查
}
但是,如果我也在elvis后面登录,我会得到一个错误:
fun check_log(supplier: Supplier<String?>) {
val arg: String = supplier.get() ?: {
logger.info { "Nothing interesting here" }
return@check_log // 'return' is not allowed here
}
// do checking
}
fun检查日志(供应商:供应商){
val arg:String=supplier.get()?:{
logger.info{“这里没什么有趣的”}
return@check_log此处不允许使用“//”返回
}
//检查
}
我解决了它,但它不是等价的,我失去了形式上的非空性:
fun check_if(supplier: Supplier<String?>) {
val arg: String? = supplier.get().also {
if (it == null) {
logger.info { "Nothing interesting here" }
return@check_if
}
}
// do checking
}
fun检查(供应商:供应商){
val arg:String?=supplier.get(){
if(it==null){
logger.info{“这里没什么有趣的”}
return@check_if
}
}
//检查
}
我可以以某种方式保留Elvis吗?
return
不允许返回,因为lambda没有内联。有关详细信息,请参阅
对于这种简单的情况,您只需执行以下操作:
val arg: String = supplier.get() ?: return logger.info { "Nothing interesting here" }
如果要运行更多语句,请使用run
:
val arg: String = supplier.get() ?: return run {
logger.info { ... }
logger.info { ... }
logger.info { ... }
}
或:
请注意,允许在
run
中使用return
,因为run
是内联的。return
是不允许的,因为lambda没有内联。有关详细信息,请参阅
对于这种简单的情况,您只需执行以下操作:
val arg: String = supplier.get() ?: return logger.info { "Nothing interesting here" }
如果要运行更多语句,请使用run
:
val arg: String = supplier.get() ?: return run {
logger.info { ... }
logger.info { ... }
logger.info { ... }
}
或:
请注意,return
在run
中是允许的,因为run
是内联的