尽管使用了选项类,但未找到映射键错误

时间:2015-11-12 21:39:38

标签: scala

我对使用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的子字符串(这是真的)什么是最好的方法?

1 个答案:

答案 0 :(得分:1)

您正在使用apply中的Map方法,该方法返回值,如果密钥不存在,则抛出NoSuchElementException

相反,您可以使用getOrElse之类的

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