访问数组的元素和 return monad?

Access element of an Array and return a monad?

如果我访问 Array 范围之外的索引,我会得到 ArrayIndexOutOfBoundsException,例如:

val a = new Array[String](3)
a(4)
java.lang.ArrayIndexOutOfBoundsException: 4

有没有一种方法可以 return monad(例如:Option)?为什么数组的默认集合应用方法不支持这个?

您可以使用 lift:

a.lift(4) // None
a.lift(2) // Some(null)

Array[T] 是一个 PartialFunction[Int, T] 并且 lift 从索引到元素类型的选项创建一个 Function[Int, Option[T]]

您可以使用 scala.util.Try:

scala> val a = new Array[String](3)
a: Array[String] = Array(null, null, null)

scala> import scala.util.Try
import scala.util.Try

scala> val fourth = Try(a(3))
third: scala.util.Try[String] = Failure(java.lang.ArrayIndexOutOfBoundsException
: 3)

scala> val third = Try(a(2))
third: scala.util.Try[String] = Success(null)

另一个好主意是首先不使用数组,但这超出了这个问题的范围。

与您的问题相关的是为什么会出现这种行为。数组旨在像 Java 数组一样工作,并与 Java 数组兼容。因为这是 Java 数组的工作方式,所以这就是数组的工作方式。