2

I have a Map[String, Any] of donuts

val donuts: Seq[Map[String, Any]] = Seq(Map("type" -> "plain", "price" -> 1.5), Map("type" -> "jelly", "price" -> 2.5))

I want to find the highest priced donut using maxBy.

val d = donuts.maxBy(donut => donut("price").toString.toDouble)

successfully returns Map[String,Any] = Map(type -> "jelly", price -> 2.5)

I can access d("price") to find the price of the highest priced donut. But if I try to do this in one line:

donuts.maxBy(donut => donut("price").toString.toDouble)("price")

it throws:

error: type mismatch;
 found   : String("price")
 required: Ordering[Double]
       (donuts.maxBy(donut => donut("price").toString.toDouble))("price")
                                                                 ^

What's the issue here, and how can I roll this into one line?

Jeffrey Chung
  • 19,319
  • 8
  • 34
  • 54
cph2117
  • 2,651
  • 1
  • 28
  • 41

1 Answers1

3

That's because the maxBy requires an implicit ordering parameter:

def maxBy[B](f: A => B)(implicit cmp: Ordering[B]): A

Unfortunately you can't use apply's syntactic sugar, because whatever you pass as a second parameter list will be passed as if it were the implicit argument. You can call apply explicitly though:

donuts.maxBy(donut => donut("price").toString.toDouble).apply("price")

It's not that pretty as what you're looking for but it's still a one liner.

Hope that helps :)

Andrei T.
  • 2,455
  • 1
  • 13
  • 28