如果 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 函数,该函数将其应用于集合中的每个元素。
首先避免空值当然是更好的方法
遍历对象的 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 函数,该函数将其应用于集合中的每个元素。
首先避免空值当然是更好的方法