【问题标题】:Transform a list of object to lists of its field将对象列表转换为其字段列表
【发布时间】:2021-11-23 21:57:53
【问题描述】:

我有一个 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 中,但我不能指望它。

【问题讨论】:

    标签: scala


    【解决方案1】:

    unzip\unzip3 获取 2\3 个子组

    假设起点:

    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\2.11 vanilla 的角度来看的。

    【讨论】:

    • 对于 scala 3 用户:您可以利用通用元组:elements.map(Tuple.fromProductTyped(_)).unzip3
    • 如果我以后有超过 3 个字段怎么办?
    • 即使MyClass 有更多字段,您也可以使用unzip\unzip3 仅选择 2\3 个相关字段。您需要为更大的元组添加自己的实现,或者只是重新考虑您的算法。 TBH 而不是使用Tuple20,我会制作一个案例类适配器。
    • 我也用通用适配器更新了帖子
    【解决方案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-06-28
      • 1970-01-01
      • 2013-12-02
      • 2010-10-03
      • 1970-01-01
      • 2019-01-17
      • 2018-05-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多