如何让mkString在scala中跳过null?
但我只想得到“abc”如何让mkString在scala中跳过null?,scala,Scala,但我只想得到“abc” 有没有一种scala方法可以跳过空值?总是有Seq(“abc”,空)。filter(!=null)。mkString(“”结合了Rex的答案和Eric的第一条评论: scala> Seq("abc", null).mkString(" ") res0: String = abc null 第一个映射将值包装成Seq[Option[String]]收集然后本质上做一个过滤器和映射,丢弃无值,只留下未包装的一些值。就像老笑话说的那样,“医生,医生,我这样做会疼的。”“
有没有一种scala方法可以跳过空值?总是有
Seq(“abc”,空)。filter(!=null)。mkString(“”
结合了Rex的答案和Eric的第一条评论:
scala> Seq("abc", null).mkString(" ")
res0: String = abc null
第一个
映射
将值包装成Seq[Option[String]]
收集
然后本质上做一个过滤器
和映射
,丢弃无
值,只留下未包装的一些
值。就像老笑话说的那样,“医生,医生,我这样做会疼的。”“所以,不要那样做。”使用选项[String]
作为你的类型,和None
而不是null
。我很想这样做,但是这些null来自Java代码。这样更好吗:Seq(Option(“abc”)、Option(null)).flatMap(s=>s).mkString(“”)?这样试试,然后通过过滤,然后通过更改Java代码。查看哪一个在保持正确的情况下更快。@NSF,flatMap(s=>s)
可以更简洁地写成flatten
Seq(“abc”,null).flatMap(Option())).mkString(“”
)。Flatte按您的要求进行操作。Seq(“abc”,null).iterator.filter(!=null).mkString(“”)
,以避免生成中间集合。@KevinWright Scala的当前版本有with filter
,不是吗?更新:刚刚尝试过-显然mkString
不能直接与withFilter
+1一起使用flatMap
方法。这就是我对惯用Scala的期望。知道Option(null)可靠地返回“None”也很好
Seq("abc", null).map(Option(_)).collect{case Some(x) => x}.mkString(" ")
scala> val seq = Seq("abc", null, "def")
seq: Seq[String] = List(abc, null, def)
scala> seq.flatMap(Option[String]).mkString(" ")
res0: String = abc def