有没有更好的方法来选择Scala中List的第一个元素

时间:2012-08-21 06:13:56

标签: list scala

目前我用它来选择列表的第一个元素:

   def Get_Read_Key =
   {
      logger.entering (TAG, "Get_Read_Key")

      val Retval = if (Read_Key_Available)
      {
         val Retval = Keystrokes.head

         Keystrokes = Keystrokes.tail

         Retval
      }
      else
      {
         calculator.ui.IKey.No_Key
      } // if

      logger.exiting (TAG, "Get_Read_Key", Retval)
          Retval
   } // Get_Read_Key

   def Read_Key_Available = Keystrokes.size > 0

但它看起来有点笨拙 - 特别是双重'雷瓦尔'。有没有更好的方法呢?或者只是使用不可变列表的代价?

背景:该例程用于Unit Test Mock类 - 设置了返回类型。

3 个答案:

答案 0 :(得分:7)

如果Keystrokes列表不为空,则以下代码将为您提供第一个元素,否则为calculator.ui.IKey.No_Key

Keystrokes.headOption.getOrElse( calculator.ui.IKey.No_Key )

P.S。将Keystrokes重新分配到尾部是设计糟糕的明确标志。相反,您应该使用 themel 中提到的算法中已有的列表迭代功能。最有可能使用mapforeach等方法来解决您的问题。

P.P.S。您违反了多个Scala naming conventions

  • 变量,值,方法和函数名称以小写
  • 开头
  • camelCase用于分隔单词而不是下划线。实际上,由于Scala对特定字符进行了特殊处理,因此非常不鼓励使用下划线。

答案 1 :(得分:6)

您正在Iterator上实施List,已经在标准库中。

val it = Keystrokes.iterator
def Read_Key_Available = it.hasNext
def Get_Read_Key = if(it.hasNext) it.next() else calculator.ui.IKey.No_Key

答案 2 :(得分:2)

您可以使用模式匹配:

Keystrokes match {
  case h::t => 
    KeyStrokes = t
    h
  case _ => 
    calculator.ui.IKey.No_key
}