如果 Seq/List 中为空,则 Scala 设置对象字段值的方法

Scala way to set object field value if null in a Seq/List

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

比如一个案例class:

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 并为空值设置名称值。

如果您想完整地保留整个集合,您只能使用 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],使您的案例 class 看起来像这样:

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

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

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

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

一个接受 AmazingData 的函数,检查名称是否为 null,如果是,则提供一个具有默认名称的新 AmazingData,否则返回输入不变。这将传递给 map 函数,该函数将其应用于集合中的每个元素。

首先避免空值当然是更好的方法