通用嵌套选项模式匹配

Generic nested Options pattern matching

我有这个数据结构,在一个选项中包含大小写 class,并且该字段也包含在一个选项中:

case class Name(value: Option[String]) extends AnyVal
case class Data(id: Int, name: Option[Name], isDefault: Boolean)

所以我想处理名称有一些的情况,上面的选项也是如此。但是当名称有 None 时,我希望结果为 None 而不是 Some(Name(None))。 我试着做这样的事情:

def handleNestedOptions(value: Option[String]): Option[Name] = {
  value match {
    case Some(data) => Some(Name(Some(data)))
    case None => None
  }
}

但我也希望以一种通用的方式使用它,这样它就可以适用于我所拥有的相同结构的任何情况 class。那么我该如何更改此实现以使其更通用呢? 通过通用我的意思是这样的: def handleNestedOptions[T, K](value: Option[K]): Option[T]

这是一种解决方法。

def handleNestedOptions[T,U](value :Option[T], f :Option[T]=>U) :Option[U] =
  if (value.isEmpty) None
  else Option(f(value))

handleNestedOptions(None, Name)        //res0: Option[Name] = None
handleNestedOptions(Some("str"), Name) //res1: Option[Name] = Some(Name(Some(str)))