Reputation: 948
I have 2 case classes
case class First(firstId: Long, pt: Long, vt: Long)
case class Second(secondId: Int, vt: Long, a: Long, b: Long, c: Long, d: Long)
I have one collection (data:Seq[First]). There is one function which transforms this sequence to another Seq[Second] after applying groupBy and one future operation. getFutureInt is some function returns 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)
Is there any way to avoid multiple minBy, maxBy?
Upvotes: 0
Views: 382
Reputation: 8036
You could compute those only once :
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)
Upvotes: 0
Reputation: 40510
You can get away with just .min
, and .max
if you define an Ordering
for your class:
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) }
}
Upvotes: 1