2015-04-30 60 views
3

我正在阅读和解析json文件。 json文件的一个领域是Nullable。它要么返回一串数字或Null。我需要将字符串转换为int。我能够从字符串由下面的代码转换为选项[INT],但不能从选项[字符串]转换为选项[INT]如何将Option [String]转换为Option [Int]?

def toInt(userId: String):Option[Int] = { 
    try { 
    Some(userId.toInt) 
    } catch { 
    case e:Exception => None 
    } 
} 

val user = toInt("abc") 

我需要什么样的变化呢?

+2

Try(userId.toInt).toOption – Infinity

回答

11
import util.Try 

def toInt(o: Option[String]): Option[Int] = 
    o.flatMap(s => Try(s.toInt).toOption) 

例子:

scala> toInt(None) 
res0: Option[Int] = None 

scala> toInt(Some("42")) 
res1: Option[Int] = Some(42) 

scala> toInt(Some("abc")) 
res2: Option[Int] = None 
3
Option(userId).map(_.toInt) 

使用Option而不是Some。不是用map将其转换为Int

0

你必须mapOption做可能包含的有价值的东西。在你的代码的上下文中,我会使用flatMap,因为当前的方法返回Option,所以我们必须将嵌套的Option扁平化。

def toInt(userIdOpt: Option[String]): Option[Int] = userIdOpt flatMap { userId => 
    try { 
    Some(userId.toInt) 
    } catch { 
    case e:Exception => None 
    } 
} 

scala> val u = Option("2") 
u: Option[String] = Some(2) 

scala> toInt(u) 
res0: Option[Int] = Some(2) 

scala> toInt(Some("a")) 
res4: Option[Int] = None 

我们可以使用Try来缩短这个。

import scala.util.Try 

def toInt(userIdOpt: Option[String]): Option[Int] = 
    userIdOpt.flatMap(a => Try(a.toInt).toOption) 

Try(a.toInt)返回Try[Int],其中转换成功将是一个Success[Int]和失败的转换(不是整数)将是一个Failure[Throwable]Try有一个非常方便的方法称为toOption,它将Success(a)转换为Some(a)FailureNone,这正是我们想要的。

相关问题