Intenta entender el código correctamente previamente a adaptarlo a tu proyecto y si tdeseas aportar algo puedes dejarlo en los comentarios.
Solución:
Usa paréntesis:
data(2)
Pero realmente no desea hacer eso con las listas muy a menudo, ya que las listas vinculadas tardan en recorrerse. Si desea indexar en una colección, utilice Vector
(inmutable) o ArrayBuffer
(mutable) o posiblemente Array
(que es solo un Java arrayexcepto que nuevamente lo indexas con (i)
en lugar de [i]
).
Más seguro es usar lift
para que pueda extraer el valor si existe y fallar con gracia si no lo hace.
data.lift(2)
Esto devolverá None si la lista no es lo suficientemente larga para proporcionar ese elemento, y Some(value) si lo es.
scala> val l = List("a", "b", "c")
scala> l.lift(1)
Some("b")
scala> l.lift(5)
None
Cada vez que realiza una operación que puede fallar de esta manera, es excelente usar una Opción y obtener el sistema de tipos para asegurarse de que está manejando el caso en el que el elemento no existe.
Explicación:
Esto funciona porque List’s apply
(que azucara solo entre paréntesis, por ejemplo l(index)
) es como una función parcial que se define dondequiera que la lista tenga un elemento. los List.lift
método convierte el parcial apply
función (una función que solo se define para algunas entradas) en una función normal (definida para cualquier entrada) básicamente envolviendo el resultado en una opción.
¿Por qué paréntesis?
Aquí está la cita del libro de programación en scala.
Otra idea importante ilustrada por este ejemplo le dará una idea de por qué se accede a los arreglos con paréntesis en Scala. Scala tiene menos casos especiales que Java. Los arreglos son simplemente instancias de clases como cualquier otra clase en Scala. Cuando aplica paréntesis alrededor de uno o más valores a una variable, Scala transformará el código en una invocación de un método llamado aplicar en esa variable. Así que greetingStrings(i) se transforma en greetingStrings.apply(i). Accediendo así a un elemento de un array en Scala es simplemente una llamada de método como cualquier otra. Este principio no se limita a las matrices: cualquier aplicación de un objeto a algunos argumentos entre paréntesis se transformará en una llamada de método de aplicación. Por supuesto, esto se compilará solo si ese tipo de objeto realmente define un método de aplicación. Así que no es un caso especial; es una regla general.
Aquí hay algunos ejemplos de cómo extraer cierto elemento (el primer elemento en este caso) usando el estilo de programación funcional.
// Create a multdimension Array
scala> val a = Array.ofDim[String](2, 3)
a: Array[Array[String]] = Array(Array(null, null, null), Array(null, null, null))
scala> a(0) = Array("1","2","3")
scala> a(1) = Array("4", "5", "6")
scala> a
Array[Array[String]] = Array(Array(1, 2, 3), Array(4, 5, 6))
// 1. paratheses
scala> a.map(_(0))
Array[String] = Array(1, 4)
// 2. apply
scala> a.map(_.apply(0))
Array[String] = Array(1, 4)
// 3. function literal
scala> a.map(a => a(0))
Array[String] = Array(1, 4)
// 4. lift
scala> a.map(_.lift(0))
Array[Option[String]] = Array(Some(1), Some(4))
// 5. head or last
scala> a.map(_.head)
Array[String] = Array(1, 4)
Te mostramos las reseñas y valoraciones de los usuarios
Finalizando este artículo puedes encontrar las crónicas de otros programadores, tú de igual forma tienes la opción de mostrar el tuyo si lo crees conveniente.