Przekonwertuj lista obiektów do listy pól

0

Pytanie

Mam listę[MyObject], w którym MyObject zawiera pola pole1, pole2 i pole3.

Szukam skuteczny sposób, aby :

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

Na java zrobiłbym coś takiego :

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());
}

Chciałbym coś bardziej funkcjonalny, ponieważ jestem w scali, ale nie mogę zrozumieć, o co chodzi.

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

Najlepsza odpowiedź

3

Otrzymasz 2\3 podgrupy z unzip\unzip3

Zakładając punkt wyjścia:

val objects: Seq[MyObject] = ???

Możesz rozpakować archiwum, aby uzyskać wszystkie 3 podgrupy:

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

Co zrobić, jeśli mam ponad 3 odpowiednich podgrup ?

Jeśli naprawdę potrzebujesz więcej podgrup, trzeba realizować swoje własne unzipN jednak zamiast tego, aby pracować z Tuple22 Ja bym osobiście używałem zasilacza:


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

Uwagi:

  • Zmienić MyObjectsProjection w zależności od potrzeb.
  • To z punktu widzenia Scala 2.12\2.11 wanilii.
2021-11-23 13:57:53

Dla użytkowników scala 3: można użyć uniwersalny orszak: elements.map(Tuple.fromProductTyped(_)).unzip3
gianluca aguzzi

Co zrobić, jeśli u mnie będzie więcej niż 3 pól później ?
Robert Reynolds

Nawet jeśli MyClass ma więcej pól, można wybrać tylko 2\3 odpowiednie pola unzip\unzip3. Trzeba dodać własne realizacji dla dużych krotek lub po prostu przemyśleć swój algorytm. TBH zamiast pracy z Tuple20 ja bym zrobił zasilacz klasy case.
gatear

Ja również zaktualizowany komunikat za pomocą uniwersalnego adaptera
gatear
2

Dalej swoje obiekty zostaną umieszczone na trzy listy:

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

W innych językach

Ta strona jest w innych językach

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