如何在 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()
    }