【问题标题】:Scala way to set object field value if null in a Seq/List如果在 Seq/List 中为 null,则 Scala 设置对象字段值的方法
【发布时间】:2017-06-17 00:57:10
【问题描述】:

在对象的 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 的名称设置值。

【问题讨论】:

  • 这些字段是什么?它们是可变/不可变类的一部分吗?你能详细说明并发布minimal reproducible example吗?
  • 我正在编辑,抱歉 :)

标签: scala list seq


【解决方案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 等。

【讨论】:

  • 这是我从第三方获得的数据。无法控制它。
  • @StasS 好的。为了答案的完整性,我将把它留在那里以供将来参考。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-11-10
    • 1970-01-01
    • 2016-02-07
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多