scala for ... yield不包括空字符串

时间:2017-08-20 22:21:47

标签: scala for-comprehension

在下面的代码中

test("duplicatedParamGetsFirst2") {
  val str = "A=B&C" //"A=B&A=C"
  val res = for {
    x <- str.split("&")
    y <- if(x.indexOf("=") == -1) "" else x.substring(x.indexOf("=") + 1)
  } yield (if (x.indexOf("=") == -1) x else x.substring(0, x.indexOf("=")), y)
  res.foreach(x => println(x))
}

我期待结果(A,B)(C,),但我得到了(A,B)。我该如何解决?

4 个答案:

答案 0 :(得分:1)

你的目标并不完全清楚。也许这很接近。

"A=B&C".split("&").map(_.split("="))
// res0: Array[Array[String]] = Array(Array(A, B), Array(C))

如果您不希望将结果放在.toList中,则可以使用Array或其他一些收藏广告。

答案 1 :(得分:1)

Leo C's solution有效。这是另一个片段,生成一对数组,与原始代码的风格接近:

val s = "A=B&C"
val res = for {
  t <- s.split("&")
  a = t.split("=")
} yield a(0) -> a.lift(1).getOrElse("") 

res.foreach(println)
// (A,B)
// (C,)

答案 2 :(得分:0)

不确定结果日期类型是否是您想要的,因为您的理解将产生Array Tuple2[String, Char],因为y在生成时属于Char类型来自String x。生成元组的一种简单方法是按以下方式应用split两次:

val str = "A=B&C"

str.split("&").
  map( x => if (x contains "=") x.split("=") else Array(x, "") ).
  map{ case Array(a, b) => (a, b) }

// res1: Array[(String, String)] = Array((A,B), (C,""))

如果你必须使用for -reherehension,这是一种方法:

val res = for {
  x <- str.split("&")
} yield if (x contains "=")
    x.split("=") match { case Array(a, b) => (a, b) } else
      (x, "")

// res2: Array[(String, String)] = Array((A,B), (C,""))

答案 3 :(得分:0)

代码应为:

val str = "A=B&C" //"A=B&A=C"
val res = for {
  x <- str.split("&")
} yield
{
  val y = if(x.indexOf("=") == -1) "" else x.substring(x.indexOf("=") + 1)
  (if (x.indexOf("=") == -1) x else x.substring(0, x.indexOf("=")), y)
}
res.foreach(x => println(x))

关于for(expressA express B),我不知道如何表达它。