Estoy buscando una forma elegante de acceder a dos elementos en un Seq al mismo tiempo. Verifiqué anteriormente en mi código que el Seq tendrá exactamente dos elementos. Ahora me gustaría poder darles nombres, para que tengan significado.

records
  .sliding(2) // makes sure we get `Seq` with two items
  .map(recs => {
    // Something like this...
    val (former, latter) = recs       
  })

¿Existe una manera elegante y / o idiomática de lograr esto en Scala?

1
mthmulders 27 feb. 2018 a las 11:00

5 respuestas

La mejor respuesta

No estoy seguro de si es más elegante, pero también puedes quitar la secuencia de esta manera:

val former +: latter +: _ = recs
2
Tim 27 feb. 2018 a las 14:06

Puede usar la coincidencia de patrones para descomponer la estructura de su lista:

val records = List("first", "second")

records match {
    case first +: second +: Nil => println(s"1: $first, 2: $second")
    case _                      => // Won't happen (you can omit this)
}

Saldrá

1: primera, 2: segunda

1
Jens Hoffmann 27 feb. 2018 a las 08:16

Para registros de tipos conocidos (por ejemplo, Int):

records.sliding (2).map (_ match { 
  case List (former:Int, latter:Int) => former + latter })

Tenga en cuenta que esto unificará el elemento (0, 1), luego (1, 2), (2, 3) ... y así sucesivamente. Para combinar por pares, use el deslizamiento (2, 2):

val pairs = records.sliding (2, 2).map (_ match { 
  case List (former: Int, latter: Int) => former + latter
  case List (one: Int) => one 
}).toList

Tenga en cuenta que ahora necesita un caso adicional para un solo elemento, si el tamaño de los registros es impar.

0
user unknown 27 feb. 2018 a las 08:32

El resultado de sliding es un List. Usando una coincidencia de patrón, puede dar nombre a estos elementos como este:

map{ case List(former, latter) => 
  ...
}

Tenga en cuenta que, dado que es una coincidencia de patrón, debe usar {} en lugar de ().

1
Shaido - Reinstate Monica 27 feb. 2018 a las 08:44

Puede acceder a los elementos por su índice:

map { recs => {
    val (former, latter) = recs(0), recs(1)       
}}
1
Maroun 27 feb. 2018 a las 08:05