Scala Seq GroupBy с будущим - PullRequest
       24

Scala Seq GroupBy с будущим

0 голосов
/ 10 декабря 2018

У меня есть 2 класса дел

case class First(firstId: Long, pt: Long, vt: Long)
case class Second(secondId: Int, vt: Long, a: Long, b: Long, c: Long, d: Long)

У меня есть одна коллекция (данные: Seq [First]).Существует одна функция, которая преобразует эту последовательность в другую Seq [Second] после применения groupBy и одну будущую операцию.getFutureInt - это некоторая функция, возвращающая Future [Int]

   val output: Future[Seq[Second]] = Future.sequence(data.groupBy(d => (d.vt, getFutureInt(d.firstId))).map
   {case(k, v) => k._2.map { si => Second(si, k._1, v.minBy(_.pt).pt,
     v.maxBy(_.pt).pt, v.minBy(_.pt).pt, v.maxBy(_.pt).pt)}}.toSeq)

Есть ли способ избежать нескольких minBy, maxBy?

Ответы [ 2 ]

0 голосов
/ 10 декабря 2018

Вы можете вычислить их только один раз:

 val output: Future[Seq[Second]] = Future.sequence(data.groupBy(d => (d.vt, getFutureInt(d.firstId))).map
  {case(k, v) => k._2.map { si => {
    val minV = v.minBy(_.pt)
    val maxV = v.maxBy(_.pt)
    Second(si, k._1, minV.pt,
      maxV.pt, minV.pt, maxV.pt)
  }}}.toSeq)
0 голосов
/ 10 декабря 2018

Вы можете обойтись только с .min и .max, если вы определите Ordering для своего класса:

 implicit val ordering = Ordering.by[First, Long](_.pt)

futures.map { case(k, v) => 
  k._2.map { si => Second(si, k._1, v.min.pt, v.max.pt, v.min.pt, v.max.pt) }
}
...