首页 文章

Scala方法设置对象字段值,如果在Seq / List中为null

提问于
浏览
0

迭代Scala Seq / List(或其他类似的集合)对象的最好方法是什么,并设置特定对象字段的值,以防它们为空?

例如,案例类:

case class AmazingData(age: Int, name: String)

val ad1 = AmazingData(12, "bar")
val ad2 = AmazingData(12, "foo")
val ad3 = AmazingData(12, null)

val alotOfAmazingData: Seq[AmazingData] = Seq(ad1, ad2, ad3)

现在我想迭代 alotOfAmazingData 并为具有null的那些设置名称值 .

2 回答

  • 1

    如果你想保持完整的集合,你只能使用 map 并包含谓词:

    val allWithNonNull = 
      alotOfAmazingData
        .map(amazing => if (amazing.name == null) amazing.copy(name = "Some Name") else amazing)
    

    如果您只关心空名称,可以过滤出设置了名称字段的实例,只留下 null ,然后 map 然后通过 copy 设置它们:

    val nonNullNames = 
      alotOfAmazingData.withFilter(_.name != null)
                       .map(_.copy(name = "Some Name"))
    

    或使用 collect

    val nonNullNames = 
      alotOfAmazingData
        .collect { 
           case amazingData if amazingData.name == null =>
         amazingData.copy(name = "Some Name") 
         }
    

    虽然我鼓励你根本不使用 null ,而是使用 Option[String] ,让你的案例类看起来像这样:

    case class AmazingData(age: Int, name: Option[String])
    

    当您想使用可选的 name 字段时,可以使用 map 等 .

  • 1

    迭代一个集合并获得一个带有修改元素的版本的好方法是 map 函数 . map 是一个高阶函数,它迭代集合并将函数应用于每个元素,并将结果作为新集合返回 .

    alotOfAmazingData.map(x => if(x.name == null) x.copy(name = default) else x)
    

    获取AmazingData的函数,检查name是否为null,然后给出一个新的AmazingData,如果是,则返回默认名称,否则返回输入不变 . 这将传递给map函数,该函数将其应用于集合的每个元素 .

    首先避免null是一种更好的方法

相关问题