我不熟悉使用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
(這是真的)的子字符串什麼是繼續進行的最佳方式?
我想你可以使用'Map'不同類型一點,達到更好的設計。難道你不能用一個'Map [Int,Option [String]]來代替只有存在密鑰時才保存數據嗎?你可以執行'myMap.get(58)'並使用'Option [Option [String]]'進行操作?外部選項告訴你有或沒有一個鍵,內部選項告訴你是否有值。 – jmelanson
我沒有看到將地圖鍵和值保存爲選項的很多要點。保存真正的鍵/值並使用返回選項的Map方法通常更有意義。 – jwvh