获取随机访问Scala集合的第一个元素的首选方法是什么

时间:2016-12-11 12:31:13

标签: scala scala-collections

有两种方法可以获得随机访问Scala集合的第一个元素(例如Vector):

1)头

myCollction.head

2)申请

myCollction(0)

从我收集的内容(来自Scala 2.10.4来源)

  • 首先检查集合是否为空并在调用apply(0)

    之前抛出异常
    override /*IterableLike*/ def head: A = {
      if (isEmpty) throw new UnsupportedOperationException("empty.head")
        apply(0)
    }
    
  • 应用首先检查索引的边界并在获取元素之前抛出IndexOutOfBoundsException

    def apply(index: Int): A = {
      val idx = checkRangeConvert(index)
      getElem(idx, idx ^ focus)
    }
    
    private def checkRangeConvert(index: Int) = {
      val idx = index + startIndex
      if (0 <= index && idx < endIndex)
        idx
      else
        throw new IndexOutOfBoundsException(index.toString)
    }
    

首选方式是什么? (实际利益/陷阱,而非个人偏好)

2 个答案:

答案 0 :(得分:1)

使用 .headOption

通常首选的方式是(但这取决于具体情况)

myCollection.headOption

.headOption返回Option值,其中option是head,当head存在时,如果集合为空则为none。

使用headOption不会抛出异常,因为集合是空的,因此您没有任何意外的惊喜。

当基础集合为空时,.head和零索引都抛出异常。

它还取决于上下文,如果你想要失败,如果head元素不存在那么.head是一个很好的方法,但很多情况下你想提供一个替代的集合中没有任何元素

答案 1 :(得分:1)

我认为选择任何集合的第一个元素(包括Vector等随机访问集合)最常用的方法是使用返回headOption的{​​{1}}方法在抛出异常的情况下。这种方法的好处是调用者可以在None上进行模式匹配并做出适当的响应。