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

时间:2017-01-31 14:31:57

标签: scala list seq

迭代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并为那些有空的那些设置名称值。

2 个答案:

答案 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当然是一种更好的方法