2016-04-05 1 views
0

я в состоянии преобразовать Option [String] в список [String] с помощью следующего кода:Как конвертировать один вариант [String] в список [Int] в Scala

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

Но как я могу конвертировать Option [String] to List [Int], поэтому в конце я могу иметь список с целыми числами: (1,3,5). Мой вариант [String] будет выглядеть следующим образом: Some ("1,3,5")

Обратите внимание, что значения 1,3,5 происходит от params.get ("ИДС") отправленного от URL и params.get является Опция [String]

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 является опцией [String] – user708683

+0

'scala> Some (" 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

Спасибо, дхг. Я изучаю 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())