funciones - Obtener elemento en la lista en Scala?
funciones en scala (3)
¿Por qué paréntesis?
Aquí está la cita de la programación del libro en Scala .
Otra idea importante ilustrada en este ejemplo le dará una idea de por qué se accede a las matrices con paréntesis en Scala. Scala tiene menos casos especiales que Java. Las matrices son simplemente instancias de clases como cualquier otra clase en Scala. Cuando aplica paréntesis que rodean 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 greetStrings (i) se transforma en greetStrings.apply (i). Por lo tanto, acceder a un elemento de una matriz en Scala es simplemente una llamada a método como cualquier otra. Este principio no está restringido a las matrices: cualquier aplicación de un objeto a algunos argumentos entre paréntesis se transformará en una llamada al método apply. Por supuesto, esto compilará solo si ese tipo de objeto realmente define un método de aplicación. Entonces no es un caso especial; es una regla general
Aquí hay algunos ejemplos de cómo tirar de cierto elemento (primer elemento en este caso) usando un 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)
¿Cómo en el mundo obtienes solo un elemento en el índice i de la Lista en scala?
Intenté get(i)
y [i]
- nada funciona. Google solo devuelve cómo "buscar" un elemento en la lista. ¡Pero ya sé el índice del elemento!
Aquí está el código que no compila:
def buildTree(data: List[Data2D]):Node ={
if(data.length == 1){
var point:Data2D = data[0] //Nope - does not work
}
return null
}
Ver la api de la Lista no ayuda, ya que mis ojos simplemente se cruzan.
Más seguro es usar la 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 genial usar una Opción y obtener el sistema de tipo para asegurarse de que está manejando el caso donde el elemento no existe.
Explicación:
Esto funciona porque la apply
la lista (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. El método List.lift
convierte la función de apply
parcial (una función que solo está definida para algunas entradas) en una función normal (definida para cualquier entrada) básicamente envolviendo el resultado en una Opción.
Usa paréntesis:
data(2)
Pero realmente no desea hacer eso con listas muy a menudo, ya que las listas vinculadas tardan en atravesarlas. Si desea indexar en una colección, use Vector
(inmutable) o ArrayBuffer
(mutable) o posiblemente Array
(que es solo una matriz de Java, excepto que indexa con (i)
lugar de [i]
).