【问题标题】:Kotlin collections: 'break out' early on null / empty / blankKotlin 集合:在 null/empty/blank 的早期“爆发”
【发布时间】:2021-12-15 18:30:56
【问题描述】:

我有一个数据类项列表作为一种查找表,从而搜索一个NAME并返回相应的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)

有没有更好的解决方案?有没有办法在链中使用 null '提前返回'?我尝试使用 ifEmpty() 但无济于事。

备注:testName 将始终是 lookupList 中的 NAME 值之一或空字符串,绝不是不在 lookupList 中的非空字符串.

【问题讨论】:

    标签: kotlin collections functional-programming


    【解决方案1】:

    我认为失败的不是对map 的调用,而是对first 的调用。尝试改用firstOrNull

    val resultID = lookupList
      .filter { it.NAME == testName }
      .map { it.ID }
      .firstOrNull()
    

    【讨论】:

    • 错误信息甚至说:列表为空。在 kotlin.collections.CollectionsKt___CollectionsKt.first
    猜你喜欢
    • 2015-09-16
    • 2017-01-18
    • 2010-12-11
    • 2012-06-17
    • 2019-06-17
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    相关资源
    最近更新 更多