2015-04-30 105 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,這正是我們想要的。

相關問題