迭代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
并为那些有空的那些设置名称值。
答案 0 :(得分:1)
如果您希望保持完整的收藏,您只能使用map
并在其中包含谓词:
val allWithNonNull =
alotOfAmazingData
.map(amazing => if (amazing.name == null) amazing.copy(name = "Some Name") else amazing)
如果您只关心空名称,则可以过滤掉设置了名称字段的实例,只留下null
,然后map
,然后通过{{1 }}:
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
等。
答案 1 :(得分:1)
迭代集合并获取具有已修改元素的版本的一种好方法是map
函数。 map
是一个高阶函数,它迭代集合并将函数应用于每个元素,并将结果作为新集合返回。
alotOfAmazingData.map(x => if(x.name == null) x.copy(name = default) else x)
一个接受AmazingData的函数,检查name是否为null,然后给出一个带有默认名称的新AmazingData,否则返回输入不变。这将传递给map函数,该函数将其应用于集合的每个元素。
首先避免使用null当然是一种更好的方法