Kotlin 集合:'break out' early on null / empty / blank
Kotlin collections: 'break out' early on null / empty / blank
我有一个数据列表 class 项目作为一种查找 table,从而搜索名称并返回相应的 ID:
data class Test(
var ID: String,
var NAME: String
)
val lookupList = listOf(
Test(ID ="0B82B4DEB07046B28BE6B861B6851DAD", NAME = "Alpha"),
Test(ID ="1F72F6C6AAB94F94B18A3AD661A2907E", NAME = "Beta"),
Test(ID ="4C23246F49EB40BB9D71FB9D0FBE25C0", NAME = "Gamma"),
Test(ID ="5D5F022A29934C77AE48E7FCFB0B985F", NAME = "Delta")
)
val testName = "Gamma"
val resultID = lookupList
.filter { it.NAME == testName }
.map { it.ID } // will fail when testName = ""
.first()
println(resultID) // prints "4C23246F49EB40BB9D71FB9D0FBE25C0"
现在在某些情况下 testName 可以为空。在这种情况下,应用程序将在 .map { it.ID } 上崩溃,因为过滤列表将为空。
在这种情况下,resultID 应该分配给 null。我能想到的最好办法是将 NAME = "" 的 Test() 条目添加到查找列表中:
data class Test(var ID: String, var NAME: String)
val lookupList = listOf(
Test(ID ="0B82B4DEB07046B28BE6B861B6851DAD", NAME = "Alpha"),
Test(ID ="1F72F6C6AAB94F94B18A3AD661A2907E", NAME = "Beta"),
Test(ID ="4C23246F49EB40BB9D71FB9D0FBE25C0", NAME = "Gamma"),
Test(ID ="5D5F022A29934C77AE48E7FCFB0B985F", NAME = "Delta")
)
val testName = ""
val resultID = lookupList
.union(listOf(Test(ID = "", NAME = ""))) // add case for empty NAME
.filter { it.NAME == testName }
.map { it.ID }
.first().ifBlank { null } // return null for empty NAME
println(resultID)
有更好的解决办法吗?有没有办法从链中 'return early' 和 null ?我尝试使用 ifEmpty() 但无济于事。
备注:testName 将始终是 lookupList 中的 NAME 值之一或空字符串,永远不会是非空字符串不在 lookupList.
中
我认为失败的不是对 map
的调用,而是对 first
的调用。请尝试使用 firstOrNull
。
val resultID = lookupList
.filter { it.NAME == testName }
.map { it.ID }
.firstOrNull()
我有一个数据列表 class 项目作为一种查找 table,从而搜索名称并返回相应的 ID:
data class Test(
var ID: String,
var NAME: String
)
val lookupList = listOf(
Test(ID ="0B82B4DEB07046B28BE6B861B6851DAD", NAME = "Alpha"),
Test(ID ="1F72F6C6AAB94F94B18A3AD661A2907E", NAME = "Beta"),
Test(ID ="4C23246F49EB40BB9D71FB9D0FBE25C0", NAME = "Gamma"),
Test(ID ="5D5F022A29934C77AE48E7FCFB0B985F", NAME = "Delta")
)
val testName = "Gamma"
val resultID = lookupList
.filter { it.NAME == testName }
.map { it.ID } // will fail when testName = ""
.first()
println(resultID) // prints "4C23246F49EB40BB9D71FB9D0FBE25C0"
现在在某些情况下 testName 可以为空。在这种情况下,应用程序将在 .map { it.ID } 上崩溃,因为过滤列表将为空。
在这种情况下,resultID 应该分配给 null。我能想到的最好办法是将 NAME = "" 的 Test() 条目添加到查找列表中:
data class Test(var ID: String, var NAME: String)
val lookupList = listOf(
Test(ID ="0B82B4DEB07046B28BE6B861B6851DAD", NAME = "Alpha"),
Test(ID ="1F72F6C6AAB94F94B18A3AD661A2907E", NAME = "Beta"),
Test(ID ="4C23246F49EB40BB9D71FB9D0FBE25C0", NAME = "Gamma"),
Test(ID ="5D5F022A29934C77AE48E7FCFB0B985F", NAME = "Delta")
)
val testName = ""
val resultID = lookupList
.union(listOf(Test(ID = "", NAME = ""))) // add case for empty NAME
.filter { it.NAME == testName }
.map { it.ID }
.first().ifBlank { null } // return null for empty NAME
println(resultID)
有更好的解决办法吗?有没有办法从链中 'return early' 和 null ?我尝试使用 ifEmpty() 但无济于事。
备注:testName 将始终是 lookupList 中的 NAME 值之一或空字符串,永远不会是非空字符串不在 lookupList.
中我认为失败的不是对 map
的调用,而是对 first
的调用。请尝试使用 firstOrNull
。
val resultID = lookupList
.filter { it.NAME == testName }
.map { it.ID }
.firstOrNull()