2016-04-05 136 views
0

我能转换选项[字符串]列出[字符串]用下面的代码:如何转换选项[字符串]列出[INT]在斯卡拉

def convertOptionToListString(a: Option[String]): List[String] = { 
    return a.toList.flatMap(_.split(",")) // ex : ("value1", "value2", "value3", etc) 
    } 

但我怎么能转换选项[字符串]列出[国际],所以最后我可以有整数列表:(1,3,5)。我的选择[字符串]请问是这样的:一些( “1,3,5”)

注意,值1,3,5来自params.get( “IDS”)从发URL和params.get选项[字符串]

val params = request.queryString.map { case (k, v) => k -> v(0) } 

感谢

+0

'某些(“1”,“3”,“5”)不是'Option [String]'。它是一个'Option(String,String,String)'。你的意思是? – dhg

+0

是的它的值1,3,5来自params.get(“ids”)从一个URL发送和params.get是一个选项[字符串] – user708683

+0

'斯卡拉>一些(“1”,“3” “5”)' 'res40:Some [(String,String,String)] = Some((1,3,5))' – Dylan

回答

0
val a: Option[String] = Some("1,3,5") 
val l = a.toList.flatMap(_.split(",")).map(_.toInt) 
+0

谢谢dhg。我正在学习scala,这个技巧会帮助我很多:) – user708683

+0

这对于非数字字符不起作用 _.toInt会抛出NumberFormatException – franki3xe

+0

@ franki3xe,如果输入以管道分隔形式出现,它也不起作用的逗号分隔,并且如果输入用罗马数字写成,或者在整数用字母替换的密码中,它将不起作用。如果你知道输入是什么样的,为什么你会添加不必要的复杂性来防范某些不会发生的事情? – dhg

1

如果你想List[String]转换为List[Int],跳过无法解析的值,那么你可以使用Try

import scala.util.Try 

List("1", "2", "3").flatMap(x => Try(x.toInt).toOption) 
res0: List[Int] = List(1, 2, 3) 

List("1", "2", "abc").flatMap(x => Try(x.toInt).toOption) 
res1: List[Int] = List(1, 2) 
+0

正则表达式和'collect'会给你类似的行为:'val IntRe =“(\\ d +)”; xs.collect {case Re(n)=> n.toInt}' – dhg

0

从你身在何处,你只需要映射toInt过去。但是你的操作顺序有点奇怪。这就像你使用toList只是为了满足类型。 toList是那些臭味的功能之一,如果你使用它,你可能会滥用一些东西。

读取最好的是,如果你有一个Some,然后对其进行处理的逻辑,否则,你就会默认为空的列表(我猜):

option match { 
    case Some(str) => str.split(",").map(_.toInt) 
    case None => List() 
} 

或者:

option.map(_.split(",").map(_.toInt)).getOrElse(List()) 
相关问题