【问题标题】:Combine List of scala case classes by time and construct new list of case class按时间组合scala案例类列表并构造新的案例类列表
【发布时间】:2018-02-23 17:59:15
【问题描述】:
trait MetaData {
    def time:DateTime
}

case class ImageMetadata(time: DateTime, name: String) extends MetaData
case class ObjectMetadata(time: DateTime, tags: List[String]) extends MetaData
case class ImageTypeMetadata(time: DateTime, name: String, tags: List[String])

我有一个返回 Future[List[ImageMetadata]]Future[List[ObjectMetadata]] 的方法;我想通过ImageMetadataObjectMetadata 中的time 字段组合这两个列表,并想构造Future[List[ImageTypeMetadata]]

我能有最好的选择吗?

【问题讨论】:

  • 你尝试了什么?发生了什么?你期望会发生什么?什么是 DateTime,导入 ...?
  • 解释你卡在哪里了? “我能在这方面有最好的选择吗?”是什么意思?
  • 您是同时等待所有期货,然后合并列表,还是其中一个期货正在推动这个过程?
  • DateTimeimport org.joda.time.DateTime。为了简化我的问题,我要如何结合List[ImageMetadata]List[ObjectMetadata] 来构建List[ImageTypeMetadata]。需要关于我可以使用哪些列表功能的建议?
  • “通过time 合并两个列表”的含义并不完全清楚。假设您有 3 个ImageMetadataList,它们都具有相同的time 值。假设您有一个List 和 2 个ObjectMetadata,两者都具有与第一个列表相同的time。这些应该如何结合?结果会是一个包含六个ImageTypeMetadata 元素的列表吗?假设没有time 成员在任一列表中匹配?结果会是一个空列表吗?具有预期结果的示例数据会有所帮助。

标签: scala collections


【解决方案1】:

这里是,如何在没有 Future 的情况下合并两个集合:

由于我的 Scala 缺少 DateTime,但我总是需要具体的示例进行测试,因此我将 DateTime 重新定义为 String。您不会使用该类型声明。 :)

type DateTime=String

val la = List (ImageMetadata("12", "im 1 foo"), ImageMetadata ("13", "im 2 bar"), ImageMetadata ("23", "im 3 bar"))
val lb = List (ObjectMetadata("23", List ("o", "1")), ObjectMetadata ("12", List("o", "2")), ObjectMetadata ("17", List("o", "3")))

for (i <- la;
     o <- lb;
     if (i.time == o.time)) yield { ImageTypeMetadata (i.time, i.name, o.tags)}

res12: List[ImageTypeMetadata] = List(ImageTypeMetadata(12,im 1 foo,List(o, 2)), ImageTypeMetadata(23,im 3 bar,List(o, 1)))

这对列表的 Futures 做同样的事情有帮助吗? 嗯,这很简单:

type DateTime=String

sealed trait MetaData {
    def time:DateTime
}
case class ImageMetadata (time: DateTime, name: String) extends MetaData
case class ObjectMetadata (time: DateTime, tags: List[String]) extends MetaData
case class ImageTypeMetadata (time: DateTime, name: String, tags: List[String])

val la = List (ImageMetadata("12", "im 1 foo"), ImageMetadata ("13", "im 2 bar"), ImageMetadata ("23", "im 3 bar"))
val lb = List (ObjectMetadata("23", List ("o", "1")), ObjectMetadata ("12", List("o", "2")), ObjectMetadata ("17", List("o", "3")))

import concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

val flim : Future [List [ImageMetadata]] = Future (la)
val flom : Future [List [ObjectMetadata]] = Future (lb)
flim.map (_.map (im => flom.map (_.map (om => {if (im.time == om.time)  Future (ImageTypeMetadata (im.time, im.name, om.tags))}))))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    相关资源
    最近更新 更多