변형 목록의체의 목록 해당 분야

0

질문

내가 목록[MyObject],와 MyObject 필드를 포함하는 필드 1,필드 2 와 필드 3 은.

내가 찾는 효율적인 방법:

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

자바에서는 다음과 같이 할 것이라 다음과 같습니다.

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

고 더 많은 기능 때문에 나는 스칼라에서 그러나 나는 할 수 없고 내습니다.

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

최고의 응답

3

2\3sub-그룹 unzip\unzip3

고 가정하고 시작점:

val objects: Seq[MyObject] = ???

압축을 풀 수 있습을 얻는 모든 3 개의 하부단위:

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

는 무엇이 있는 경우 3 개 이상의 관련 하위 그룹?

당신이 정말로 필요한 경우 더 하위 그룹을 구현해야 하는 경우가 자신 unzipN 그러나 대신의 작업 Tuple22 나 개인적으로 사용하는 접합기:


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

Notes:

  • 변경 MyObjectsProjection 귀하의 필요에 따라.
  • 이것은 스칼라 2.12\2.11 바닐라 관점입니다.
2021-11-23 13:57:53

에 대한 scala3 용:을 활용할 수 있습니다 일반적인 tuple: elements.map(Tuple.fromProductTyped(_)).unzip3
gianluca aguzzi

이 있는 경우에는 어떻게 더 이상 3 이상 필드 후?
Robert Reynolds

는 경우에도 MyClass 이 더 있는 필드를 선택할 수 있습니다 단지 2\3 관련 분야와 unzip\unzip3. 를 추가할 필요가 자신의 구현을 위한 더 큰 튜플 또는 그냥 재고 알고리즘이 있습니다. TBH 신의 작업 Tuple20 저는 경우 등 어댑터입니다.
gatear

업데이트는 게시물 일반적인뿐만 아니라 어댑터
gatear
2

다음과 같은 것입니다 분해 귀하의 개체를 세 가지로 나열:

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

다른 언어로

이 페이지는 다른 언어로되어 있습니다

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