目前我用它来选择列表的第一个元素:
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类 - 设置了返回类型。
答案 0 :(得分:7)
如果Keystrokes
列表不为空,则以下代码将为您提供第一个元素,否则为calculator.ui.IKey.No_Key
:
Keystrokes.headOption.getOrElse( calculator.ui.IKey.No_Key )
P.S。将Keystrokes
重新分配到尾部是设计糟糕的明确标志。相反,您应该使用 themel 中提到的算法中已有的列表迭代功能。最有可能使用map
或foreach
等方法来解决您的问题。
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
}