2015-11-12 20 views
0

我不熟悉使用Option類型的概念,但我試圖在此類中的多個位置使用它以避免這些錯誤。儘管使用了選項類,但未找到映射鍵錯誤

以下類用於存儲數據。

class InTags(val tag35: Option[String], val tag11: Option[String], val tag_109: Option[String], val tag_58: Option[String]) 

下面的代碼接受一個字符串,並通過在等號上分開將其轉換爲一個Int - > String映射。

 val message= FIXMessage("8=FIX.4.29=25435=D49=REDACTED56=REDACTED115=REDACTED::::::::::CENTRAL34=296952=20151112-17:11:1111=Order7203109=CENTRAL1=TestAccount63=021=155=CSCO48=CSCO.O22=5207=OQ54=160=20151112-17:11:1338=5000040=244=2815=USD59=047=A13201=CSCO.O13202=510=127 
") 
     val tag58 = message.fields(Some(58)).getOrElse("???") 
     val in_messages= new InTags(message.fields(Some(35)), message.fields(Some(11)), message.fields(Some(109)), Some(tag58)) 
     println(in_messages.tag_109.getOrElse("???")) 

其中FIXMessage對象的定義如下:

class FIXMessage (flds: Map[Option[Int], Option[String]]) { 
    val fields = flds 

    def this(fixString: String) = this(FIXMessage.parseFixString(Some(fixString))) 

    override def toString: String = { 
    fields.toString 
    } 
} 
object FIXMessage{ 
    def apply(flds: Map[Option[Int], Option[String]]) = { 
    new FIXMessage(flds) 
    } 

    def apply(flds: String) = { 
    new FIXMessage(flds) 
    } 

    def parseFixString(fixString: Option[String]): Map[Option[Int], Option[String]] = { 
    val str = fixString.getOrElse("str=???") 
     val parts = str.split(1.toChar) 
     (for { 
     part <- parts 
     p = part.split('=') 
     } yield Some(p(0).toInt) -> Some(p(1))).toMap 
    } 
} 

我得到的錯誤是ERROR key not found: Some(58)但犯規的選項類處理這個問題?這基本上意味着傳遞給FIXMessage對象的字符串不包含格式爲58=something(這是真的)的子字符串什麼是繼續進行的最佳方式?

+0

我想你可以使用'Map'不同類型一點,達到更好的設計。難道你不能用一個'Map [Int,Option [String]]來代替只有存在密鑰時才保存數據嗎?你可以執行'myMap.get(58)'並使用'Option [Option [String]]'進行操作?外部選項告訴你有或沒有一個鍵,內部選項告訴你是否有值。 – jmelanson

+0

我沒有看到將地圖鍵和值保存爲選項的很多要點。保存真正的鍵/值並使用返回選項的Map方法通常更有意義。 – jwvh

回答

1

您在Map中使用apply方法,如果不存在密鑰,則返回值或丟棄NoSuchElementException

相反,你可以使用getOrElse

message.fields.getOrElse(Some(58), Some("str")) 
+0

當你輸入它時,我只是想到了這一點!這最終爲我修復了 val tag58 = message.fields.getOrElse(Some(58),None) – Zee

+1

@Zee'fields.get(Some(58))'與'fields.getOrElse(Some(58) ),無)' –

相關問題