我想编写非常漂亮的惯用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]
答案 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)
通常你会对你找到的元素做一些有趣的事情。