这是我的Foo数据类定义
data class Foo(
var fooArg: Array<Int?>? = null,
)
Run Code Online (Sandbox Code Playgroud)
这是对它的调用:
val bar: Array<Int> = arrayOf(1,2,3)
val foo = Foo(fooArg = bar)
Run Code Online (Sandbox Code Playgroud)
但这给出了一个错误type mismatch: required Array<Int?>? but found Array<Int>
我很困惑,它需要一个可为空的类型,而我为它提供了一个非空值,该类型如何不匹配?
我目前正在从 java 切换到 kotlin,不断出现的优点之一是 kotlin 是空安全的,默认情况下不能为变量或对象分配空值,但有一些方法可以分配空值。空值。但是我不确定为什么这有好处,Java 不安全会产生什么问题?
到目前为止,在线搜索仅给出了零安全是什么的描述,而不是为什么要实现零安全。提前致谢。
我是科特林新手。有人可以告诉我如何在下面的 cade 中仅当不为空时才设置该值。应该有一种方法可以使用 withlet()但我不知道该怎么做。
如果var2不为空,只有我应该设置它。否则会抛出空指针错误。
private fun myFunc(var1: Type1 , var2: Type2?) {
val request = class1.newBuilder()
.setType1(var1)
.setType2(var2) // how to set var2 only if not null?
.build()
clientClass.send(request)
}
Run Code Online (Sandbox Code Playgroud) 最近有一些讨论是否!! 应该用在kotlin代码中.一种观点认为它根本不应该被使用,因为这对kotlin来说是一种不好的做法,并增加了崩溃的风险.
另一种意见感觉使用!! 只要你知道在任何已知条件下可以为空的数据都不应该是空的,这绝对不是一件坏事!在那里只是一个安全卫士(如果它出乎意料地变为零,它应该不会被捕获并引起关注,那么它肯定需要被调查).它不应该考虑使用!! 是一个崩溃的原因.
有没有人有意见或vor使用!! (不是盲目地使用它)?
下面两个示例,没有看到dataCount_2会更好,还是?
var data: List<Data>? = null // it will be set before calling the two dataCount()
fun dataCount_1() : Int {
return if (data!=null && data!!.isNotEmpty()) data!![0].count else 0
}
fun dataCount_2() : Int {
data?.let { dataList ->
if (dataList.isNotEmpty()) {
return dataList[0].count ?: 0
}
}
return 0
}
Run Code Online (Sandbox Code Playgroud) 在 Kotlin 中,可以对 Map 使用方括号表示法,因此以下代码:
val mapOfMap: Map<String, Map<String, String>> = mapOf("Key1" to mapOf("Subkey1" to "Value1", "Subkey2" to "Value2"))
println(mapOfMap["Key1"])
Run Code Online (Sandbox Code Playgroud)
印刷:
{Subkey1=Value1, Subkey2=Value2}
Run Code Online (Sandbox Code Playgroud)
那太棒了。但为什么我不能执行以下操作
println(mapOfMap["Key1"]["Subkey1"])
Run Code Online (Sandbox Code Playgroud)
它会导致编译错误:在 Map 类型的可空接收器上只允许安全 (?.) 或非空断言 (!!.) 调用?
处理这个问题的正确方法是什么?
我正在尝试运行这个例子
fun main() {
val mlist: MutableList<String> = mutableListOf<String>()
val mapp: MutableMap<Int, MutableList<String>> = mutableMapOf(1 to mlist)
println(mapp)
mapp[1].add("a") // Correct is mapp[1]?.add("a")
println(mapp)
}
Run Code Online (Sandbox Code Playgroud)
编译器正在抱怨 Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type MutableList<String>?.
尽管我已经定义了MutableList<String>为什么编译器会说有关MutableList<String>?.
什么编译器比我更懂?!我在这里缺少什么?
让我们f()返回一个可为空的值。
我想做的是,
如果f()为null,则获取一个空列表,
否则,如果f()不为null,则获取单个项目的列表value。
在Scala中,我们可以执行以下操作:
Option(f()).toList
Run Code Online (Sandbox Code Playgroud)
或更详细地
Option(f()).map(v => List(v)).getOrElse(List.empty)
Run Code Online (Sandbox Code Playgroud)
在Kotlin中,没有Option(假设没有Funktionale库),在Scala中null toList()与(None: Option)没有不同。
我们有Elvis运算符,但在listOf()函数内部将为null ,因此它将为
listOf(f() ?: /* What can I do here? */)
Run Code Online (Sandbox Code Playgroud)
我们想要的null是listOf(/*no argument */),但是Elvis运算符需要一个参数,因此listOf(f() ?: )将导致编译错误。
至少我们可以做
val v = f()
if (v == null) listOf() else listOf(v)
Run Code Online (Sandbox Code Playgroud)
但它是两个衬里。
为此有一些表达吗?
我将在类的主要构造函数默认参数中使用此表达式,因此,如果它不是一个衬里,则将其括在方括号中,因此如下所示:
class A(
val p1: List<V> = run {
val v = f()
if (v == null) listOf() …Run Code Online (Sandbox Code Playgroud) 我对以下实例中?和的用法有点困惑。!!
lat = mLastLocation?.latitude.toString()
longi = mLastLocation!!.longitude.toString()
Run Code Online (Sandbox Code Playgroud)
我应该使用哪个空安全运算符?
我已经用“!!”读过了 代替 ”?。” 在 kotlin 中不推荐。检查变量中是否为 null 时,两者有什么区别?
我需要对我的列表进行一些操作。
例如我有以下列表TestData:
data class TestData (
val value: Int?,
val name: String
)
Run Code Online (Sandbox Code Playgroud)
我需要将列表映射TestData到列表String。这是我的代码:
val names = listOfTestData
.map { data -> getName(data.value) } <- Type mismatch. Required: Int, found Int?
.distinct()
Run Code Online (Sandbox Code Playgroud)
问题是该函数getName(value: Int)仅接受不可为 null 的类型。我可以以某种方式跳过 null 的元素listOfTestData吗value?
我可以在制作地图之前过滤这些值,但我必须在地图内部使用!!,我想要一个更优雅的解决方案。
val names = listOfTestData
.filter { it.value != null }
.map { data -> getName(data.value!!) }
.distinct()
Run Code Online (Sandbox Code Playgroud)
请告诉我如何在不使用的情况下完成此操作!!
collections arraylist kotlin kotlin-extension kotlin-null-safety