如何在 Scala 中提取包裹在 Option 中的序列元素?
How to extract sequence elements wrapped in Option in Scala?
我正在学习 Scala 并且正在努力处理 Option[Seq[String]]
我需要处理的对象。我需要根据 charAt(0).isUpper
条件过滤一小串字符串 Seq("hello", "Scala", "!")
。
在普通 val arr = Seq("hello", "Scala", "!")
上做起来和 arr.filter(_.charAt(0).isUpper)
一样简单。然而,在 Option(Seq("hello", "Scala", "!"))
上做同样的事情是行不通的,因为你需要先在它上面调用 .getOrElse
。但即便如此,您如何应用条件?
arr.filter(_.getOrElse(false).charAt(0).isUpper
是错误的。我尝试了很多变体,搜索 Whosebug 也没有帮助,我想知道这是否完全可行。在 Scala 中是否有一种惯用的方法来处理 Option
包装案例?
您可以只调用 foreach 或 map 选项,即 arr.map(seq => seq.filter(_.charAt(0).isUpper))
如果要将 f: X => Y
应用到 X
类型的值 x
,请编写 f(x)
.
如果要将 f: X => Y
应用到 Option[X]
类型的值 ox
,请编写 ox.map(f)
.
您似乎已经知道要对序列做什么,所以只需将适当的 f
放入 map
。
示例:
val ox = Option(Seq("hello", "Scala", "!"))
ox.map(_.filter(_(0).isUpper)) // Some(Seq("Scala"))
对于这种情况,您可以使用 模式匹配 作为
Option(Seq("hello", "Scala", "!")) match {
case Some(x) => x.filter(_.charAt(0).isUpper)
case None => Seq()
}
我正在学习 Scala 并且正在努力处理 Option[Seq[String]]
我需要处理的对象。我需要根据 charAt(0).isUpper
条件过滤一小串字符串 Seq("hello", "Scala", "!")
。
在普通 val arr = Seq("hello", "Scala", "!")
上做起来和 arr.filter(_.charAt(0).isUpper)
一样简单。然而,在 Option(Seq("hello", "Scala", "!"))
上做同样的事情是行不通的,因为你需要先在它上面调用 .getOrElse
。但即便如此,您如何应用条件?
arr.filter(_.getOrElse(false).charAt(0).isUpper
是错误的。我尝试了很多变体,搜索 Whosebug 也没有帮助,我想知道这是否完全可行。在 Scala 中是否有一种惯用的方法来处理 Option
包装案例?
您可以只调用 foreach 或 map 选项,即 arr.map(seq => seq.filter(_.charAt(0).isUpper))
如果要将 f: X => Y
应用到 X
类型的值 x
,请编写 f(x)
.
如果要将 f: X => Y
应用到 Option[X]
类型的值 ox
,请编写 ox.map(f)
.
您似乎已经知道要对序列做什么,所以只需将适当的 f
放入 map
。
示例:
val ox = Option(Seq("hello", "Scala", "!"))
ox.map(_.filter(_(0).isUpper)) // Some(Seq("Scala"))
对于这种情况,您可以使用 模式匹配 作为
Option(Seq("hello", "Scala", "!")) match {
case Some(x) => x.filter(_.charAt(0).isUpper)
case None => Seq()
}