在功能上使用 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"))
}

模式匹配非常强大。

或者,映射是另一种选择:

mapping 一个 Option 只会在它的值不为空时发生,并且 flatMapping 将删除添加的 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"))
      }
    }

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...