Search code examples
scalamaxby

Cannot access Map returned by maxBy


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?


Solution

  • 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 :)