首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有更好的方法在Scala中选择列表的第一个元素

有没有更好的方法在Scala中选择列表的第一个元素
EN

Stack Overflow用户
提问于 2012-08-21 14:13:56
回答 3查看 200关注 0票数 1

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

代码语言:javascript
复制
   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

但它看起来有点笨拙--尤其是双重的“Retval”。有没有更好的方法来做这件事?或者这仅仅是使用不可变列表的代价?

背景:该例程用于单元测试模拟类-返回类型已设置。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-21 14:25:56

你正在List上实现一个Iterator,它已经在标准库中了。

代码语言:javascript
复制
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
票数 6
EN

Stack Overflow用户

发布于 2012-08-21 15:00:34

如果Keystrokes列表的第一个元素不为空,则下面的代码将获取该元素,否则将获取calculator.ui.IKey.No_Key

代码语言:javascript
复制
Keystrokes.headOption.getOrElse( calculator.ui.IKey.No_Key )

附注:将Keystrokes重新分配到尾部是一个糟糕设计的明确标志。相反,你应该在你的算法中使用themel提到的列表已经存在的迭代功能。使用诸如mapforeach之类的方法很可能会解决您的问题。

附注:你已经违反了几个Scala naming conventions

以lowercase

  • camelCase开头的
  • 变量、值、方法和函数名称用于分隔单词,而不是下划线。实际上,由于Scala对特定字符

有特殊处理,因此极不鼓励使用下划线来实现这些目的

票数 7
EN

Stack Overflow用户

发布于 2012-08-21 14:21:57

您可以使用模式匹配:

代码语言:javascript
复制
Keystrokes match {
  case h::t => 
    KeyStrokes = t
    h
  case _ => 
    calculator.ui.IKey.No_key
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12049261

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档