将对象列表转换为其字段列表
Transform a list of object to lists of its field
我有一个 List[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,所以我想要一些更实用的东西,但我不能指手画脚。
以下会将您的对象分解为三个列表:
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)
})
得到 2 个子组 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
。
- 这是 Scala 2.12.11 vanilla 的视角。
我有一个 List[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,所以我想要一些更实用的东西,但我不能指手画脚。
以下会将您的对象分解为三个列表:
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)
})
得到 2 个子组 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
。 - 这是 Scala 2.12.11 vanilla 的视角。