Transformar una lista de objetos a las listas de su campo

0

Pregunta

Tengo una Lista[MyObject], con MyObject que contiene los campos campo1, campo2 y campo3.

Estoy buscando una manera eficaz de hacer :

Tuple3(_.map(_.field1), _.map(_.field2), _.map(_.field3))

En java me gustaría hacer algo como :

Field1Type f1 = new ArrayList<Field1Type>();
Field2Type f2 = new ArrayList<Field2Type>();
Field3Type f3 = new ArrayList<Field3Type>();


for(MyObject mo : myObjects) {
    f1.add(mo.getField1());
    f2.add(mo.getField2());
    f3.add(mo.getField3());
}

Me gustaría algo más funcional ya que estoy en la scala, pero no puedo poner mi dedo en él.

scala
2021-11-23 10:53:16
2

Mejor respuesta

3

Consigue 2\3 sub-grupos con unzip\unzip3

Suponiendo que el punto de partida:

val objects: Seq[MyObject] = ???

Puede descomprimir para obtener todos los 3 sub-grupos:

val (firsts, seconds, thirds) =  
  objects
    .unzip3((o: MyObject) => (o.f1, o.f2, o.f3))

¿Qué pasa si tengo más de 3 relevantes sub-grupos ?

Si usted realmente necesita más sub-grupos que usted necesita para implementar su propio unzipN sin embargo, en lugar de trabajar con Tuple22 Yo personalmente uso un adaptador:


case class MyObjectsProjection(private val objs: Seq[MyObject]) {
  
  lazy val f1s: Seq[String] =
    objs.map(_.f1)

  lazy val f2s: Seq[String] =
    objs.map(_.f2)

    ... 
  
  lazy val f22s: Seq[String] =
    objs.map(_.f3)
}

val objects: Seq[MyClass] = ???
val objsProjection = MyObjectsProjection(objects)

objs.f1s
objs.f2s
...
objs.f22s

Notas:

  • Cambio MyObjectsProjection de acuerdo a sus necesidades.
  • Esto es de una Scala 2.12\2.11 vainilla perspectiva.
2021-11-23 13:57:53

Para scala 3 usuarios: puede aprovechar genérico tupla: elements.map(Tuple.fromProductTyped(_)).unzip3
gianluca aguzzi

¿Qué pasa si tengo más de 3 campos más adelante ?
Robert Reynolds

Incluso si MyClass tiene más campos de los que puede seleccionar sólo 2\3 campos correspondientes con unzip\unzip3. Usted necesita agregar sus propias implementaciones más grandes tuplas o simplemente repensar su algoritmo. TBH, en lugar de trabajar con Tuple20 me gustaría hacer un caso de la clase adaptador.
gatear

He actualizado el post con un adaptador genérico así
gatear
2

El siguiente se van a descomponer los objetos en tres listas:

case class MyObject[T,S,R](f1: T, f2: S, f3: R)

val myObjects: Seq[MyObject[Int, Double, String]] = ???

val (l1, l2, l3) = myObjects.foldLeft((List.empty[Int], List.empty[Double], List.empty[String]))((acc, nxt) => {
  (nxt.f1 :: acc._1, nxt.f2 :: acc._2, nxt.f3 :: acc._3)
})
2021-11-23 11:17:18

En otros idiomas

Esta página está en otros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Slovenský
..................................................................................................................