如何在Scala中提取包装在选项中的序列元素?
我正在学习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)。但即便如此,你怎么能应用这个条件呢
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()
,就可以了