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

模式匹配很强大

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

mapping Option 仅当其值不为空时才会发生,flatMapping 将从 [=] 删除添加的 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"))
      }
    }