scala - 没有初始化/无时,是否有最佳实践为 Scala 选项赋值?

标签 scala functional-programming variable-assignment

我有以下类,其中属性是 Option[T]

class User extends IdBaseEntity[UUID] {
  var id: Option[UUID] = None
  var name: Option[String] = None
  var createdOn: Option[Date] = None
}

在某些数据访问层中,如果在将对象持久化到 cassandra 之前未设置这些属性,我需要分配这些属性。以下是 createdOn 属性的几种方法。这些是最好的方法还是我应该做的更好?

示例 1

entity.createdOn = Some(entity.createdOn.map(identity).getOrElse(new Date()))

示例 2

entity.createdOn = entity.createdOn.orElse(Some(new Date()))

示例 3

entity.createdOn = entity.createdOn match {
  case None => Some(new Date())
  case _ => entity.createdOn
}

示例 4

entity.createdOn = entity.createdOn match {
  case None => Some(new Date())
  case Some(x) => Some(x)
}

示例 5

entity.createdOn match {
  case None => entity.createdOn = Some(new Date())
  case _ =>;
}

最佳答案

Option 上的匹配并不是真正地道(恕我直言)。我更喜欢获取 orElsegetOrElse。我个人会选择示例 2。

我不确定这是否适合您的用例,但使 User 成为不可变的案例类更为惯用:

case class User(id: Option[UUID] = None, ...)

复制它,而不是就地更新字段:

val updatedEntity = entity.copy(name = user.name.orElse(Some("Chris")))

关于scala - 没有初始化/无时,是否有最佳实践为 Scala 选项赋值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16310438/

相关文章:

scala - Scala 中有抑制异常吗?

haskell 类型

java - 为什么在java中不允许没有括号的赋值和 boolean 运算符

functional-programming - 纯函数只有一种可能的实现吗?

java - 在同一语句中为数组分配多个值

list - scala zip 列表到元组

scala - 如何使类型类与 scala 中的异构列表一起使用

oop - FP 和 OO 正交吗?

mysql - 玩框架scala和mysql报错

haskell - 有没有办法 "remove"仿函数中不存储其参数的部分?