如何解决在功能上使用 scala.Option
我有一个 Option,比如说 O,它可以是 None 也可以在里面有一些值。如果它有一些值,该值可能有一个标志,比如 f。我的要求是,如果 O 为 None,那么我创建一个对象,比如 MyEntity 类型,但是如果 O 的值的标志为 true,我返回 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"))
}
解决方法
我第一次看错了你的问题,所以这里是尝试#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
层,从 {{1} }到Option[Option[MyEntity]]
Option[MyEntity]
,
如评论中所述,Nil
类型是 List
,并且您的表达式应始终返回相同的类型(实际上不应该是 Any
)。
一种可能性是为 MyEntity
定义一个“哨兵”值,例如:
object MyEntity {
val Nil = MyEntity("")
}
现在你可以写:
val result = O.fold(MyEntity("x")) {
case true => MyEntity.Nil
case false => 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"))
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。