如何在Scala中提取包裹在Option中的序列元素?

时间:2018-07-05 16:10:21

标签: scala scala-option

我正在学习Scala并在需要处理的Option[Seq[String]]对象方面挣扎。我需要针对Seq("hello", "Scala", "!")条件过滤一小串字符串charAt(0).isUpper

在普通val arr = Seq("hello", "Scala", "!")上进行操作与arr.filter(_.charAt(0).isUpper)一样容易。但是,在Option(Seq("hello", "Scala", "!"))上执行相同操作将不起作用,因为您需要先在其上调用.getOrElse。但是即使如此,您如何应用该条件?

arr.filter(_.getOrElse(false).charAt(0).isUpper是错误的。我尝试了很多变体,但是搜索stackoverflow还是没有帮助,我想知道这是否完全可能。有没有一种惯用的方法来处理Scala中的Option包装的案例?

3 个答案:

答案 0 :(得分:4)

如果要将f: X => Y应用于类型x的值X,则写f(x)

如果要将f: X => Y应用于类型ox的值Option[X],则写ox.map(f)

您似乎已经知道要对序列进行什么操作,因此只需将适当的f放入map中即可。

示例:

val ox = Option(Seq("hello", "Scala", "!"))

ox.map(_.filter(_(0).isUpper)) // Some(Seq("Scala"))

答案 1 :(得分:3)

您可以仅调用foreach或映射选项,即arr.map(seq => seq.filter(_.charAt(0).isUpper))

答案 2 :(得分:2)

在这种情况下,您可以使用模式匹配作为

{{1}}