使用高阶函数处理 Scala Option 类型
Process Scala Option type with higher-order functions
有个class
class MyType {
def status(): String = "Connected" // demo implementation
}
我有一个val x: Option[Option[MyType]]
。我需要像下面这样处理这个值:
x match {
case None => "Error1"
case Some(None) => "Error2"
case Some(Some(t)) => t.status
}
我想用 Tom Morris post 中描述的高阶函数重写相同的代码。正确的编码方式是什么?
有一些关于提问动机的话。官方文档says:
The most idiomatic way to use an scala.Option
instance is to treat it as a collection or monad and use map
,flatMap
, filter
, or foreach
<...>
A less-idiomatic way to use scala.Option
values is via pattern matching
我不太确定我理解 "idiomatic" 的确切含义,但听起来像 "good"对我来说。
是这样的吗?
x.fold("Error1")(_.fold("Error2")(_.status()))
map
-方式:
x.map(_.map(_.status).getOrElse("Error2")).getOrElse("Error1")
有个class
class MyType {
def status(): String = "Connected" // demo implementation
}
我有一个val x: Option[Option[MyType]]
。我需要像下面这样处理这个值:
x match {
case None => "Error1"
case Some(None) => "Error2"
case Some(Some(t)) => t.status
}
我想用 Tom Morris post 中描述的高阶函数重写相同的代码。正确的编码方式是什么?
有一些关于提问动机的话。官方文档says:
The most idiomatic way to use an
scala.Option
instance is to treat it as a collection or monad and usemap
,flatMap
,filter
, orforeach
<...> A less-idiomatic way to usescala.Option
values is via pattern matching
我不太确定我理解 "idiomatic" 的确切含义,但听起来像 "good"对我来说。
是这样的吗?
x.fold("Error1")(_.fold("Error2")(_.status()))
map
-方式:
x.map(_.map(_.status).getOrElse("Error2")).getOrElse("Error1")