在Kotlin中,从map访问值会以不同的方式提供不同的接收器类型
映射的类型为LinkedHashMap类型
如果我不在此行中为空判断
println("Morning: ${daypartEvents[Daypart.MORNING].size}")
个
编译器给出了错误
List类型的可空接收器上只允许安全(?.)或非空的断言(!!.)调用.
但是,如果try 通过使用forEach函数迭代映射来实现相同的结果,则如下所示
daypartEvents.forEach { (daypart, events) -> println("$daypart: ${events.size}") }
个
它不想让我对它进行空判断.
即使我做了空判断,它也会说
对List类型的非null接收器进行不必要的安全调用
我知道这个问题表达得很糟糕,所以请原谅我
这里我想知道的是,为什么List类型的映射值一开始是可以为空的,之后是不可为空的.
为清晰起见,完整代码
enum class Daypart {
MORNING, AFTERNOON, EVENING
}
data class Event (
val title: String,
val description: String? = null,
val daypart: Daypart,
val duration: Int
)
fun main() {
val event1 = Event(title = "Wake up", description = "Time to get up", daypart = Daypart.MORNING, duration = 0)
val event2 = Event(title = "Eat breakfast", daypart = Daypart.MORNING, duration = 15)
val event3 = Event(title = "Learn about Kotlin", daypart = Daypart.AFTERNOON, duration = 30)
val event4 = Event(title = "Practice Compose", daypart = Daypart.AFTERNOON, duration = 60)
val event5 = Event(title = "Watch latest DevBytes video", daypart = Daypart.AFTERNOON, duration = 10)
val event6 = Event(title = "Check out latest Android Jetpack library", daypart = Daypart.EVENING, duration = 45)
val events = mutableListOf<Event>(event1, event2, event3, event4, event5, event6)
val daypartEvents = events.groupBy {
it.daypart
}
print(daypartEvents::class.simpleName)
println("Morning: ${daypartEvents[Daypart.MORNING]?.size}")
daypartEvents.forEach { (daypart, events) ->
println("$daypart: ${events.size}")
}
}
我对Kotlin还是个新手,这是Developer.android.com上Android Jetpack Compose for Beginners课程中的练习之一