我正在学习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
包装的案例?
答案 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}}