我对使用Option类型的概念不熟悉,但我尝试在此类中使用多个位置来避免这些错误。
以下类用于存储数据。
class InTags(val tag35: Option[String], val tag11: Option[String], val tag_109: Option[String], val tag_58: Option[String])
以下代码采用字符串并将其转换为Int - >通过分隔等号的字符串映射。
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 :(得分:1)
您正在使用apply
中的Map
方法,该方法返回值,如果密钥不存在,则抛出NoSuchElementException
。
相反,您可以使用getOrElse
之类的
message.fields.getOrElse(Some(58), Some("str"))