Scala字符串列表选项[String]与mkString一起使用

Scala字符串列表选项[String]与mkString一起使用,scala,Scala,我有一个列表,可以有一个字符串或选项[String] 像这样 val a = List("duck","dog","cat") a.mkString(:) duck:dog:cat val b = List(Some("duck"), "dog", None) 我的输出应该是 “鸭子:狗” 我怎样才能做到这一点,我得到一些关于这个的信息: scala> a.map{ x => | x match { | case x:String => x

我有一个列表,可以有一个字符串或选项[String]

像这样

val a = List("duck","dog","cat")

a.mkString(:)

duck:dog:cat

val b = List(Some("duck"), "dog", None)
我的输出应该是

“鸭子:狗”

我怎样才能做到这一点,我得到一些关于这个的信息:

scala> a.map{ x =>
     | x match {
     | case x:String => x
     | case Some(x:String) => x
     | case None => null}}

List[String] = List(duck, dog, null)

scala> res.filter(_!=null).mkString(":")
res24: String = duck:dog

有更好的方法吗?

您可以
flatMap
来摆脱
过滤器

  b.flatMap {
    case x: String => List(x)
    case Some(x) => List(x)
    case None => List()
  }.mkString(":")
或者您可以在
映射之前
过滤

  b.filter(_ != None).map {
    case x: String => x
    case Some(x) => x
  }.mkString(":")

您可以
flatMap
来摆脱
过滤器

  b.flatMap {
    case x: String => List(x)
    case Some(x) => List(x)
    case None => List()
  }.mkString(":")
或者您可以在
映射之前
过滤

  b.filter(_ != None).map {
    case x: String => x
    case Some(x) => x
  }.mkString(":")

这是一个使用
收集
的完美示例。
我们想创建一个只包含部分元素的列表,然后我们想使用
mkString

val b = List(Some("duck"), "dog", None)

val result: List[String] = b collect {
  case x: String => x
  case Some(x: String) => x
}
result.mkString(":")

这是一个使用
收集
的完美示例。
我们想创建一个只包含部分元素的列表,然后我们想使用
mkString

val b = List(Some("duck"), "dog", None)

val result: List[String] = b collect {
  case x: String => x
  case Some(x: String) => x
}
result.mkString(":")

这是一个适用于
null

scala> val l = List(Some("duck"), "dog", None, null)
l: List[java.io.Serializable] = List(Some(duck), dog, None, null)

scala> l.map{a => a match { 
       | case null => "" 
       | case Some(a) => Some(a).get.toString 
       | case None => "" 
       | case _ => a.toString}}.filter(_.length > 0).mkString(":")

res7: String = duck:dog

这是一个适用于
null

scala> val l = List(Some("duck"), "dog", None, null)
l: List[java.io.Serializable] = List(Some(duck), dog, None, null)

scala> l.map{a => a match { 
       | case null => "" 
       | case Some(a) => Some(a).get.toString 
       | case None => "" 
       | case _ => a.toString}}.filter(_.length > 0).mkString(":")

res7: String = duck:dog

理想情况下,如果给你一个
列表[Any]
,你会修复任何问题。你能用
null
代替
None
吗?理想情况下,如果给你一个
列表[Any]
,你会修复任何问题。你能用
null
代替
None
吗?