如何在Scala中提取包装在选项中的序列元素?

如何在Scala中提取包装在选项中的序列元素?,scala,scala-option,Scala,Scala Option,我正在学习Scala,正在努力处理我需要处理的对象。有一个小字符串数组Seq(“hello”,“Scala”,“!”),我需要根据charAt(0)进行筛选。isUpper条件 在普通的val-arr=Seq(“hello”,“Scala”,“!”)上执行此操作与arr.filter(u.charAt(0).isUpper)一样简单。但是,在选项(Seq(“hello”,“Scala”,“!”)上执行相同操作将不起作用,因为您需要先调用.getOrElse)。但即便如此,你怎么能应用这个条件呢

我正在学习Scala,正在努力处理我需要处理的对象。有一个小字符串数组
Seq(“hello”,“Scala”,“!”)
,我需要根据
charAt(0)进行筛选。isUpper
条件

在普通的
val-arr=Seq(“hello”,“Scala”,“!”)
上执行此操作与
arr.filter(u.charAt(0).isUpper)
一样简单。但是,在
选项(Seq(“hello”,“Scala”,“!”)上执行相同操作将不起作用,因为您需要先调用
.getOrElse
)。但即便如此,你怎么能应用这个条件呢


arr.filter(u.getOrElse(false).charAt(0).isUpper
是错误的。我尝试了很多变体,搜索stackoverflow也没有帮助,我想知道这是否有可能。是否有一种惯用的方法来处理Scala中的
选项
包装的情况?

您可以调用foreach或map选项,即
arr.map(seq=>seq.filter(u.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()
    }

Some(Seq(“hello”,“Scala”,“!”)).map(Seq=>Seq.filter(u.charAt(0).isUpper))
甚至可以简化为:
.map(Seq=>Seq.filter(u(0).isUpper))
当你有选项的时候,你总是可以使用匹配案例。嗯,但是使用
foreach
好吗?我假设它应该只用于副作用方法。对,那么就使用map,这也适用于选项。什么?什么是
.foreach.
?我手边没有scala解释器,已经有一段时间了,所以这是伪代码:)那不是伪代码。这是foreach的错误用法。方法
foreach
需要一个函数值参数
.foreach.
是尝试使用零参数调用
foreach
。一大于零,不用翻译我就能告诉你很多@AndreyTyukin当选项返回None时,这就是返回的内容:)我认为调试返回
Seq(“None”)
的代码可能和调试无法正确处理用户的大型管理遗留web应用程序一样有趣……不,只要将其改为更自然的选择
Seq()
,就可以了