从 Option[] 包装的对象中读取多个变量

发布于 2024-11-30 09:11:40 字数 647 浏览 1 评论 0原文

我有一个变量 obj: Option[MyObject] 并希望从中提取多个变量 - 如果未设置该对象,则应使用默认值。

目前我是这样做的:

val var1 = obj match {
    case Some(o) => e.var1
    case _ => "default1"
}
val var2 = obj match {
    case Some(o) => e.var2
    case _ => "default2"
}
...

这是非常冗长的。我知道我可以这样做:

val var1 = if (obj.isDefined) obj.get.var1 else "default1"
val var2 = if (obj.isDefined) obj.get.var2 else "default2"

这仍然看起来很奇怪。我知道我可以使用一个大匹配并返回一个值对象或元组。

但我想要的是与此类似的东西:

val var1 = obj ? _.var1 : "default1"
val var2 = obj ? _.var2 : "default2"

这可能以某种方式吗?

I have a variable obj: Option[MyObject] and want to extract multiple variables from it - if the object is not set, default values should be used.

Currently I do it like this:

val var1 = obj match {
    case Some(o) => e.var1
    case _ => "default1"
}
val var2 = obj match {
    case Some(o) => e.var2
    case _ => "default2"
}
...

which is extremely verbose. I know I could do it like this:

val var1 = if (obj.isDefined) obj.get.var1 else "default1"
val var2 = if (obj.isDefined) obj.get.var2 else "default2"

which still seems strange. I know I could use one big match and return a value object or tuple.

But what I would love is something similar to this:

val var1 = obj ? _.var1 : "default1"
val var2 = obj ? _.var2 : "default2"

Is this possible somehow?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

只涨不跌 2024-12-07 09:11:40

这个怎么样?

obj.map(_.var1).getOrElse("default1")

或者,如果您喜欢这种风格:

obj map (_ var1) getOrElse "default"

How about this?

obj.map(_.var1).getOrElse("default1")

or, if you prefer this style:

obj map (_ var1) getOrElse "default"
千と千尋 2024-12-07 09:11:40

另一种变体是使用 空对象模式 的版本并直接使用该对象

//could also be val or lazy val
def myDefault = new MyObject {
  override val var1 = "default1"
  override val var2 = "default2"
}

val myObj = obj getOrElse myDefault

use(myObj.var1)
use(myObj.var2)

Another variation would be to use a version of the Null Object Pattern and use the object directly

//could also be val or lazy val
def myDefault = new MyObject {
  override val var1 = "default1"
  override val var2 = "default2"
}

val myObj = obj getOrElse myDefault

use(myObj.var1)
use(myObj.var2)
谢绝鈎搭 2024-12-07 09:11:40

要从选项中提取多个值,我建议返回一个元组并使用提取器语法:

val (val1, val2) = obj.map{o => (o.var1, o.var2)}.getOrElse(("default1", "default2"))

To extract multiple values from an Option I'd recommend returning a tuple and using the extractor syntax:

val (val1, val2) = obj.map{o => (o.var1, o.var2)}.getOrElse(("default1", "default2"))
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文