2014-02-25 3 views
1

Предположим, мне нужно преобразовать String в Int в Scala. Если строка не является числом, я бы хотел вернуть None, а не исключать исключение.String to Int в Scala

я нашел следующее solution

 
def toMaybeInt(s:String) = { 
    import scala.util.control.Exception._ 
    catching(classOf[NumberFormatException]) opt s.toInt 
} 

ли смысл? Вы изменили бы/улучшили бы его?

+2

Другие, чем при использовании 'Try' (@ ответ Брайаном), я бы назвал метод' toIntOption' быть больше в соответствии со стандартными именами Scala. –

ответ

6

Я бы использовал scala.util.Try, который возвращает Success или Failure для вычисления, которое может вызвать исключение.

scala> val zero = "0" 
zero: String = 0 

scala> val foo = "foo" 
foo: String = foo 

scala> scala.util.Try(zero.toInt) 
res5: scala.util.Try[Int] = Success(0) 

scala> scala.util.Try(foo.toInt) 
res6: scala.util.Try[Int] = Failure(java.lang.NumberFormatException: For input string: "foo") 

Так, toMaybeInt(s: String) становится:

def toMaybeInt(s:String) = { 
    scala.util.Try(s.toInt) 
} 
+0

Спасибо, но мне нужно вернуть 'Option' сейчас. – Michael

+0

@ Майкл Используйте 'toOption'. – Brian

+0

'Catch [+ T] .toOption'? – Michael

3

Для получения вариант в любом случае, независимо от возможных исключений из-за числа пороков развития,

import scala.util.Try 

def toOptInt(s:String) = Try(s.toInt) toOption 

Тогда

scala> toOptInt("123") 
res2: Option[Int] = Some(123) 

scala> toOptInt("1a23") 
res3: Option[Int] = None 

Далее, Рассмотрим

implicit class convertToOptInt(val s: String) extends AnyVal { 
    def toOptInt() = Try(s.toInt) toOption 
} 

Следовательно

scala> "123".toOptInt 
res5: Option[Int] = Some(123) 

scala> "1a23".toOptInt 
res6: Option[Int] = None