2

我有一个Map[String, Any]甜甜圈

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

我想找到价格最高的甜甜圈maxBy

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

成功返回Map[String,Any] = Map(type -> "jelly", price -> 2.5)

我可以访问d("price")找到价格最高的甜甜圈的价格。但是,如果我尝试在一行中执行此操作:

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

它抛出:

错误:类型不匹配;
 找到:字符串(“价格”)
 要求:订购[双]
       (donuts.maxBy(donut => donut("price").toString.toDouble))("price")
                                                                 ^

这里有什么问题,我怎样才能把它变成一条线?

4

1 回答 1

3

那是因为maxBy需要一个隐式排序参数:

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

不幸的是,您不能使用 apply 的语法糖,因为您作为第二个参数列表传递的任何内容都将被传递,就好像它是隐式参数一样。您可以明确调用 apply :

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

它不像你要找的那么漂亮,但它仍然是一个衬里。

希望有帮助:)

于 2017-08-08T15:17:13.663 回答