如何在 Scala 中将 Option[String] 转换为 List [Int]

How to convert an Option[String]to List [Int]in Scala

我可以使用以下代码将 Option[String] 转换为 List[String] :

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

但是我如何将 Option[String] 转换为 List[Int] 所以最后我可以得到包含整数的列表:(1,3,5)。我的 Option[String] 看起来像这样: Some("1,3,5")

请注意,值 1,3,5 来自 params.get("ids") 发送自url 和 params.getOption[String]

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

谢谢

如果要将 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)
val a: Option[String] = Some("1,3,5")
val l = a.toList.flatMap(_.split(",")).map(_.toInt)

从你所在的地方,你只需要在它上面映射 toInt。但是你的操作顺序有点奇怪。这就像你使用 toList 只是为了满足类型。 toList 是那些臭味函数之一,如果你在使用它,你可能在滥用某些东西。

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

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

或:

option.map(_.split(",").map(_.toInt)).getOrElse(List())

Scala 2.13介绍了String::toIntOption

结合 flatMap,我们可以安全地将 String 转换为 Int 并消除格式错误的输入:

List("1", "2", "abc").flatMap(_.toIntOption)
// List[Int] = List(1, 2)