在功能上使用 scala.Option
Using scala.Option functionally
我有一个选项,比如说 O,它可以是 None 或者可能有一些内部值。如果它有一些值,该值可能有一个标志,比如 f。我的要求是,如果 O 是 None,那么我创建一个对象,比如 MyEntity 类型,但是如果 O 的值带有标志为 true,我 return Nil 否则我创建具有不同的 MyEntity 的实例价值。 Java代码可以差不多为:
if(O.isEmpty) {
MyEntity("x")
} else {
if(O.f) {
Nil
} else {
MyEntity("y") // with different value
}
}
我想使用 scala.Option 中提供的 HoF 以函数式风格执行此操作。最好的方法是什么?到目前为止我可以做到这一点:
if(O.isEmpty){
MyEntity("x")
} else {
Option.unless(O.exists(_.f))(MyEntity("y"))
}
如评论中所述,Nil
类型是 List
,您的表达式应始终 return 相同类型(实际上不应该是 Any
)。
一种可能性是为 MyEntity
定义一个“哨兵”值,例如:
object MyEntity {
val Nil = MyEntity("")
}
现在你可以写:
val result = O.fold(MyEntity("x")) {
case true => MyEntity.Nil
case false => MyEntity("y")
}
我第一次看错了你的问题,所以这是尝试#2
这是一个很好的模式匹配案例:
val maybeMyEntity: Option[MyEntity] = option match {
case Some(flagValue) if flagValue => None
// case Some(true) => None (More concise, but does not highlight a handy feature)
case Some(_) => Some(MyEntity("Y"))
case None => Some(MyEntity("X"))
}
模式匹配很强大
或者,映射是另一种选择:
map
ping Option
仅当其值不为空时才会发生,flatMap
ping 将从 [=] 删除添加的 Option
层16=] 到 Option[MyEntity]
val result: Option[MyEntity] = if (option.isEmpty) {
Some(Entity("X"))
} else {
option.flatMap { flagValue =>
if (flagValue) {
None
} else {
Some(MyEntity("Y"))
}
}
}
case class AnOption(var flag: Boolean = true)
case class MyEntities(name: String)
val myOptionEntityCheck = (someOption: Option[AnOption]) => {
someOption match {
case None => Some(MyEntities("X"))
case Some(aValue: AnOption) if aValue.flag => None
// OR case Some(AnOption(true)) => None
case Some(_) => Some(MyEntities("y"))
}
}
我有一个选项,比如说 O,它可以是 None 或者可能有一些内部值。如果它有一些值,该值可能有一个标志,比如 f。我的要求是,如果 O 是 None,那么我创建一个对象,比如 MyEntity 类型,但是如果 O 的值带有标志为 true,我 return Nil 否则我创建具有不同的 MyEntity 的实例价值。 Java代码可以差不多为:
if(O.isEmpty) {
MyEntity("x")
} else {
if(O.f) {
Nil
} else {
MyEntity("y") // with different value
}
}
我想使用 scala.Option 中提供的 HoF 以函数式风格执行此操作。最好的方法是什么?到目前为止我可以做到这一点:
if(O.isEmpty){
MyEntity("x")
} else {
Option.unless(O.exists(_.f))(MyEntity("y"))
}
如评论中所述,Nil
类型是 List
,您的表达式应始终 return 相同类型(实际上不应该是 Any
)。
一种可能性是为 MyEntity
定义一个“哨兵”值,例如:
object MyEntity {
val Nil = MyEntity("")
}
现在你可以写:
val result = O.fold(MyEntity("x")) {
case true => MyEntity.Nil
case false => MyEntity("y")
}
我第一次看错了你的问题,所以这是尝试#2
这是一个很好的模式匹配案例:
val maybeMyEntity: Option[MyEntity] = option match {
case Some(flagValue) if flagValue => None
// case Some(true) => None (More concise, but does not highlight a handy feature)
case Some(_) => Some(MyEntity("Y"))
case None => Some(MyEntity("X"))
}
模式匹配很强大
或者,映射是另一种选择:
map
ping Option
仅当其值不为空时才会发生,flatMap
ping 将从 [=] 删除添加的 Option
层16=] 到 Option[MyEntity]
val result: Option[MyEntity] = if (option.isEmpty) {
Some(Entity("X"))
} else {
option.flatMap { flagValue =>
if (flagValue) {
None
} else {
Some(MyEntity("Y"))
}
}
}
case class AnOption(var flag: Boolean = true)
case class MyEntities(name: String)
val myOptionEntityCheck = (someOption: Option[AnOption]) => {
someOption match {
case None => Some(MyEntities("X"))
case Some(aValue: AnOption) if aValue.flag => None
// OR case Some(AnOption(true)) => None
case Some(_) => Some(MyEntities("y"))
}
}