Scala 附加可选元素的列表
我需要创建一个序列,给定一个包含可选字符串列表的列表,将所有字符串串联起来,形成一个新列表。我的代码是这样的:Scala 附加可选元素的列表,scala,sequence,option,Scala,Sequence,Option,我需要创建一个序列,给定一个包含可选字符串列表的列表,将所有字符串串联起来,形成一个新列表。我的代码是这样的: res.foldLeft(Seq[Option[Seq[String]]]())((acc, v) => v match { case Some(x) => acc ++: Some(x) case None => acc }) 其中,res是包含可选列表元素的列表,例如: List(Some(Seq(foo)), Som
res.foldLeft(Seq[Option[Seq[String]]]())((acc, v) => v match {
case Some(x) => acc ++: Some(x)
case None => acc
})
其中,res
是包含可选列表元素的列表,例如:
List(Some(Seq(foo)), Some(Seq(bar)), None, Some(Seq(baz, blah)))
我在符号+:
处得到一个编译错误,表示:
type mismatch; found : Iterable[Equals] required: Seq[Option[Seq[String]]]
我做错了什么?我没有在这个框上安装scala,但是您可以尝试使用“map”函数从等式中删除选项,然后将seq列表展平为单个iterable 大概是这样的:
res.map.flatten
据我所知,您将得到一个包含“foo”、“bar”、“sez”、“bar”的Iterable
稍后我会检查一下,以测试语法是否正确,以及我所写的内容是否有效
干杯,亚伦
编辑:访问了我的scala终端,这可以:
res.map(s => s).flatten.flatten
我没有在这个框上安装scala,但是您可以尝试使用“map”函数删除等式中的选项,然后将seq列表展平为单个iterable 大概是这样的:
res.map.flatten
据我所知,您将得到一个包含“foo”、“bar”、“sez”、“bar”的Iterable
稍后我会检查一下,以测试语法是否正确,以及我所写的内容是否有效
干杯,亚伦
编辑:访问了我的scala终端,这可以:
res.map(s => s).flatten.flatten
你为什么不这样做呢:
res.flatten.flatten
第一个展平
将去掉无
并显示选项
s,第二个将在序列
上执行预期的展平操作为什么不执行以下操作:
res.flatten.flatten
第一个
flatten
将去掉None
s并显示选项
s,第二个将在Seq
s中对情况下的类型执行预期的展平操作一些(x)=>acc++:一些(x)
部分错误
+:
运算符需要类型为Seq[Option[Seq[String]]]]
的参数,但您提供的是类型为Option[Seq[String]]]
的参数
附言:如果你能准确说出你期望的结果。我可以改进这个答案,以帮助您编写所需的正确代码。您在
案例中的键入Some(x)=>acc++:Some(x)
部分错误
+:
运算符需要类型为Seq[Option[Seq[String]]]]
的参数,但您提供的是类型为Option[Seq[String]]]
的参数
附言:如果你能准确说出你期望的结果。我可以改进此答案,以帮助您编写所需的正确代码。1。您需要为
map
传递一个函数。2. <代码>地图(f)。展平可以替换为flatMap(f)
。True。。事实上,我自己还在学习这门语言。来自@dimitrisli的最终答案是好的、简单的和优雅的。感谢您的评论,这有助于我的学习。map(s=>s)
除了创建副本外,什么都不做,它可以被删除。1。您需要为map
传递一个函数。2. <代码>地图(f)。展平可以替换为flatMap(f)
。True。。事实上,我自己还在学习这门语言。来自@dimitrisli的最终答案是好的、简单的和优雅的。感谢您的评论,这有助于我的学习。map(s=>s)
除了创建副本外,什么都不做,它可以被删除。