访问数组的元素和 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 数组的工作方式,所以这就是数组的工作方式。
如果我访问 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 数组的工作方式,所以这就是数组的工作方式。