我是Kotlin的新手并且已经多次读过Kotlin的Null Safety,但我真的很困惑,并且不清楚.谁能帮我回答下面的问题:
什么!字符fun getString(key: String!)意味着什么?
以下运算符的名称是否正确:
?.:安全呼叫运营商
?::猫王运营商
!!:当然是运营商
?:运营商和?.let?之间有什么区别?我什么时候应该使用每一个?在我的Kotlin应用程序中,我有像这样的可空变量
private var myCallback : (() -> Unit)? = null
Run Code Online (Sandbox Code Playgroud)
是否可以使用null安全运算符?来调用它?这给了我一个编译错误.
myCallback?()
Run Code Online (Sandbox Code Playgroud)
如果它不是空的话,我发现只有这种丑陋的方式
if(myCallback != null)
myCallback!!()
Run Code Online (Sandbox Code Playgroud) 看看这个kotlin one liner:
val nonNullArr : List<NonNullType> = nullArray.filter {it != null}
Run Code Online (Sandbox Code Playgroud)
编译器在此行给出类型错误,表示无法将空列表分配给非空值列表.但过滤条件确保列表仅包含非空值.有没有类似于!!运算符的东西,我可以在这种情况下使用这个代码编译?
我专门要求非空类型Nothing。
我确实知道,Nothing?例如,它允许我们过滤null以使重载明确无误,但我一直在努力思考Nothing有用的实例。
Nothing?可以只有一个值null。因此Nothing可以完全没有价值。重点是什么?为什么不简单使用Unit?
在Kotlin中,还有其他的“ Kotlin”方法可以执行以下操作吗?
fun parse(inputSample: Sample): List<String> =
when {
inputSample.foo != null -> parse(inputSample.foo)
inputSample.bar != null -> parse(inputSample.bar)
else -> emptyList()
}
Run Code Online (Sandbox Code Playgroud)
我怀疑nullwith的支票when可以用Kotlin写成不同的形式
我是Kotlin的新手,并尝试将我们现有代码库中的众多Android Util方法之一转换为Kotlin扩展函数.
这是Kotlin代码:
fun Activity?.isAlive(): Boolean {
return !(this?.isFinishing ?: false)
}
Run Code Online (Sandbox Code Playgroud)
这意味着相当于这个Java方法:
public static boolean isAlive(Activity activity) {
return activity != null && !activity.isFinishing();
}
Run Code Online (Sandbox Code Playgroud)
不过,我仍然获得NPEs在科特林代码每当Activity为null.关于我哪里出错的任何想法?
java android kotlin kotlin-android-extensions kotlin-null-safety
你会如何以更科学的方式编写以下代码?
var returnValue = ...
val s3data = presignedUrl.body()
if (s3data != null) {
val uploadImage = api.uploadImage(s3data.bucketUrl, s3data.awsAccessKeyId, s3data.policy, s3data.key, s3data.signature, body).execute()
if (!uploadImage.isSuccessful) {
crashReporterService.sendIssue("Failed uploading file", "Failed uploading file ${uploadImage.raw()}")
returnValue = Result.FAILURE
} else {
returnValue = Result.SUCCESS
}
} else {
crashReporterService.sendIssue("Failed uploading image", "Error - ${presignedUrl.raw()}")
returnValue = Result.FAILURE
}
return returnValue
Run Code Online (Sandbox Code Playgroud)
我可以使用let,但我觉得它使代码更难理解
我目前正在学习Kotlin,以在我的android应用程序中替换Java,但正在努力确保安全性。
我已经熟悉处理null和non-null变量的过程,但是,我仍然不确定Kotlin中实现null / non-null变量方面的“最佳实践”。
例如,在Java中,我将编写如下内容:
UserAccount account;
if (account == null) {
openLogin();
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以在Kotlin中复制此语言,但似乎该语言旨在避免这种做法。我应该如何通过Kotlin实施此系统,我应该添加可为空的变量吗?
所以我有一个简单的回调类:
class Callback<T>(
val onResponse: (T) -> Unit,
val onError:(Throwable)->Unit
)
Run Code Online (Sandbox Code Playgroud)
现在我想实现一个处理错误的方法.可能会或可能不会callback需要调用.
private fun handleServerError(error:IServerError, callback:Callback<*>? = null){
val reason = error.cause
when(reason){
is Because.ServerRejectsLogin -> {
doAsync { uiThread { mainActivity.longToast("sorry, your session timed out. please log in again.") } }
IntentManager.doLogin(mainActivity)
}
else -> callback?.onError(reason)
}
}
Run Code Online (Sandbox Code Playgroud)
这给我一个错误:
Reference有一个可以为null的类型
((Throwable) -> Unit)?使用explicit?.invoke()来进行类似函数的调用
它似乎期待的是
else -> callback?.onError?.invoke(reason)
Run Code Online (Sandbox Code Playgroud)
而且我不太明白为什么.不应该callback是非空的事实足以导致必须有一个非空onError函数?
如果我写的话,加上侮辱伤害
else -> callback?.let{it.onError(reason)}
Run Code Online (Sandbox Code Playgroud)
然后它接受了但不是在警告我我应该之前
删除多余的
.let电话
当涉及到地图时,我对 Kotlin 的 null 安全功能感到困惑。我有一个Map<String, String>。但我可以打电话map.get(null),它会返回null以指示地图中不存在该钥匙。我预计会出现编译器错误,因为map是 aMap<String, String>而不是Map<String?, String>. 我怎么可以通过null争论String呢?
还有一个相关的问题:是否有任何类型的 Map,无论是 stdlib 还是第三方实现,NullPointerException如果我调用,可能会抛出异常get(null)?我想知道对于 的任何有效实现,调用map.get(s)而不是,是否安全。s?.let { map.get(it) }Map
更新
编译器确实返回了一个错误map.get(null)。但这并不是因为空安全,而是因为文字null没有向编译器指示所传递参数的类型。我的实际代码更像是这样的:
val map: Map<String, String> = ...
val s: String? = null
val t = map.get(s)
Run Code Online (Sandbox Code Playgroud)
上面的代码编译良好,并返回null. 当键应该是String不可空的时,为什么会这样呢?