为什么Scala的indexOf(在List等中)返回Int而不是Option [Int]?

时间:2014-08-22 21:32:00

标签: scala scala-collections indexof standard-library api-design

我想编写非常漂亮的惯用Scala代码list indexOf foo getOrElse Int.MaxValue,但现在我必须满足于寻找愚蠢的Java代码val result = list indexOf foo; if (result < 0) Int.MaxValue else result。 Scala中indexOf返回Int而非Option[Int]

是否有充分理由?

3 个答案:

答案 0 :(得分:10)

这是为了兼容Java和速度。您必须双击答案(首先在java.lang.Integer然后Option)而不是仅返回一个负数。这可能会延长十倍。

如果遇到麻烦,您可以随时写下将负数转换为None而将非负数转换为Some(n)的内容:

implicit class OptionOutNegatives(val underlying: Int) extends AnyVal {
  def asIndex = if (underlying < 0) None else Some(underlying)
}

答案 1 :(得分:3)

它不一定是那样的。

scala> "abcde" index 'c'
res0: psp.std.Index = 2

scala> "abcde" index 'z'
res1: psp.std.Index = -1

scala> "abcde" index 'z' match { case Index(n) => n ; case _ => MaxInt }
res2: Int = 2147483647

// Emphasizing that at the bytecode level we still return an Int - no boxing.
scala> :javap psp.std.SeqLikeExtensionOps
[...]
public abstract int index(A);
  descriptor: (Ljava/lang/Object;)I

那是来自psp-std,您可以运行“sbt console”然后运行上面的内容。

答案 2 :(得分:1)

为解决第二个问题,在主要问题和第三个问题之间进行挤压,还有其他方法可以处理索引,查找或收集满足谓词的元素。

scala> ('a' to 'z').zipWithIndex find (_._1 == 'k') map (_._2)
res6: Option[Int] = Some(10)

通常你会对你找到的元素做一些有趣的事情。