变换一个名单的对象清单的领域

0

的问题

我有一个名单[MyObject],MyObject包含的领域field1,field2和field3.

我在寻找一种有效的方式这样做:

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

在java我会做这样的:

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\3个小团体 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

注:

  • 改变 MyObjectsProjection 根据你的需求。
  • 这是来自拉斯卡拉2.12\2.11香草的观点。
2021-11-23 13:57:53

为卡拉3个用户:可以利用通用的元组: elements.map(Tuple.fromProductTyped(_)).unzip3
gianluca aguzzi

如果我有3个以上领域的后来的?
Robert Reynolds

甚至如果 MyClass 有更多的领域可以只选择2\3相关领域 unzip\unzip3. 你需要添加自己的实现更大的多元组,或只是重新考虑你的算法。 别而不是工作 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ý
..................................................................................................................