如何在Scala的过滤器中使用if-else条件?

时间:2018-08-04 06:52:15

标签: scala

我有一个ArrayBuffer,其数据格式如下:period_name:character different(15)year:bigint。其中的数据表示表的列名及其数据类型。我的要求是提取列名的句点和数据类型,只是从“(”到“)”中除去子字符串之外的字符变化,然后将所有元素发送到ListBuffer。我想出了以下逻辑:

for(i <- receivedGpData) {
   gpTypes = i.split("\\:")
   if(gpTypes(1).contains("(")) {
       gpColType = gpTypes(1).substring(0, gpTypes(1).indexOf("("))
       prepList += gpTypes(0) + " " + gpColType
   } else {
       prepList += gpTypes(0) + " " + gpTypes(1)
   }
}

上面的代码正在工作,但是我正在尝试使用Scala的Map和Filter函数实现相同的功能。我不明白的是在条件之后如何在Scala过滤器中使用if-else条件:

var reList = receivedGpData.map(element => element.split(":"))
                           .filter{ x => x(1).contains("(")
                                  }

有人可以让我知道如何使用Scala的map&filter函数在for循环中实现相同的代码吗?

2 个答案:

答案 0 :(得分:1)

val receivedGpData = Array("bla:bla(1)","bla2:cat")

val res = receivedGpData
  .map(_.split(":"))
  .map(s=>(s(0),s(1).takeWhile(_!='(')))
  .map(s => s"${s._1} ${s._2}").toList

println(res)

答案 1 :(得分:1)

使用正则表达式:

val p = "(\\w+):([.[^(]]*)(\\(.*\\))?".r
val res = data.map{case p(x,y,_)=>x+" "+y}

在Scala REPL中:

scala> val data = Array("period_name:character varying(15)","year:bigint")
data: Array[String] = Array(period_name:character varying(15), year:bigint)
scala> val p = "(\\w+):([.[^(]]*)(\\(.*\\))?".r
p: scala.util.matching.Regex = (\w+):([.[^(]]*)(\(.*\))?
scala> val res = data.map{case p(x,y,_)=>x+" "+y}
res: Array[String] = Array(period_name character varying, year bigint)