通用嵌套选项模式匹配
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)))
我有这个数据结构,在一个选项中包含大小写 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)))