Scala中正确指定内联隐式Ordering的方法
正确实现方式
你的写法无效是因为Scala中集合的sorted方法的隐式参数,不能通过调用时定义带默认值的隐式参数这种方式传递。以下是几种可行的正确写法:
方式一:显式传递Ordering实例
直接把排序规则作为显式参数传给sorted,这是最直接的写法:
es.sorted(Ordering.by(_.name))
方式二:局部作用域定义隐式Ordering
如果希望当前代码块内Employee的排序规则自动生效,可以先定义隐式值,再调用sorted:
implicit val employeeNameOrdering: Ordering[Employee] = Ordering.by(_.name) es.sorted // 编译器会自动匹配上面的隐式Ordering
方式三:自定义方法时绑定默认隐式规则
如果是在自定义方法中需要支持这种灵活排序,可以结合上下文绑定和默认隐式参数,这种写法仅适用于方法定义场景:
def sortEmployees(es: List[Employee])(implicit ord: Ordering[Employee] = Ordering.by(_.name)): List[Employee] = { es.sorted } // 调用时可省略参数,使用默认的按name排序 sortEmployees(es) // 也可以显式传入其他排序规则 sortEmployees(es)(Ordering.by(_.id))
内容的提问来源于stack exchange,提问作者Sergey Bushmanov
相关产品推荐
相关产品推荐

