我对使用选项类型的概念很陌生,但为了避免这些错误,我尝试在这个类中使用它的多个位置。
下面的类用于存储数据。
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的子字符串(这是真的)--什么是最好的方法?
发布于 2015-11-12 21:52:30
在apply中使用Map方法,如果不存在键,则返回值或抛出NoSuchElementException。
相反,您可以使用getOrElse,例如
message.fields.getOrElse(Some(58), Some("str"))https://stackoverflow.com/questions/33681945
复制相似问题