2017-06-06 79 views
0

我有一個方法如下:動態添加元素後,模式匹配匹配的情況下映射

protected def extract(implicit params:Params) = 
    Map(
    "address" -> params.address, 
    "city" -> reconcileCity, 
    "region" -> params.region, 
)collect { 
    case (k, v) if v.isDefined => k -> v.get 
    } 

我想從另一個方法代替城市的價值如下:

protected def reconcileCity(implicit params:Params) 
    params.city match { 
    case Some("madras") => "Chennai" 
    case Some("bangalore") => "Bengaluru" 
    case Some("gurgaon") => "Gurugram" 
    case _ => params.city.mkString 
} 

但我得到如下錯誤:

Error:(177, 24) value isDefined is not a member of java.io.Serializable 
    case (k, v) if v.isDefined => k -> v.get 
    Error:(177, 44) value get is not a member of java.io.Serializable 
    case (k, v) if v.isDefined => k -> v.get 

請幫忙。

+0

什麼是你的地圖值的類型?看起來編譯器推斷'java.io.Serializable'是所有值類型的共同祖先。 –

+0

對於下面的情形: '保護的高清提取物(隱含PARAMS:PARAMS)= 地圖( 「地址」 - > params.address, 「城市」 - > params.city, 「區域」 - > PARAMS。如果v.isDefined => k - > v.get }' }它收到{ )案件(k,v)。只有在我從方法'extract'調用通用方法'reconcileCity'後,我獲取錯誤的方法'reconcileCity'的類型是Serializable – b1399877

回答

0

isDefined是存在於Option類中的一種方法。 但是你試圖用String替換Option [String],並且在其上調用isDefined

我假設在params一切都是Option,使你的代碼應該是這個樣子:

protected def reconcileCity(implicit params:Params) 
params.city match { 
case Some("madras") => Some("Chennai") 
    case Some("bangalore") => Some("Bengaluru") 
    case Some("gurgaon") => Some("Gurugram") 
    case other => other 
} 
+0

謝謝!任何方式來處理這種情況下的大小寫敏感。這就是我想要處理的: 'protected def reconcileCity(implicit params:Params) params.city match { case有些(「madras」)或(「Madras」 )=>一些(「欽奈」) 案例一些(「班加羅爾」)或(「班加羅爾」)=>一些(「班加羅爾」) 案例某些(「古爾岡」)或(「古爾岡」)= Gurugram「) case other =>其他 }' – b1399877

+0

你的意思是這樣的: 'case一些(str)if str.toLowerCase()==」madras「=>一些(」Chennai「)' – Alexey

+0

我的意思是它應該處理所有情況:''madras「,」MADRAS「,」Madras「'等 – b1399877

0

上@同意阿列克謝的回答是isDefinedget是可以應用到Option類方法。 Alexay建議所有返回的值更改爲Some但我建議只改變返回值Some作爲

protected def extract(implicit params:Params) = 
    Map(
     "address" -> params.address, 
     "city" -> Some(reconcileCity), 
     "region" -> params.region 
    )collect { 
     case (k, v) if v.isDefined => k -> v.get 
    } 


    protected def reconcileCity(implicit params:Params) = params.city.get match { 
    case "madras" | "Madras" => "Chennai" 
    case "bangalore" | "Banglore" => "Bengaluru" 
    case "gurgaon" | "GurGaon" => "Gurugram" 
    case _ => params.city.mkString 
    } 
+0

'params.city'是'None'的情況? 另外,它不處理''MADRAS''例如,雖然這不是問題的原始部分... :-( – Alexey