Function Scala保存排序函数参数
我试图保存用于在Scala中对序列进行排序的参数,以便稍后延迟执行 例如,我希望保存(“.value”)排序函数,而不是“list.sortBy(.value)”,并在以后检索此排序函数(“.value”)以进行实际排序 如何保存和检索延迟执行的排序函数参数?以下是一些示例测试代码:Function Scala保存排序函数参数,function,scala,sorting,Function,Scala,Sorting,我试图保存用于在Scala中对序列进行排序的参数,以便稍后延迟执行 例如,我希望保存(“.value”)排序函数,而不是“list.sortBy(.value)”,并在以后检索此排序函数(“.value”)以进行实际排序 如何保存和检索延迟执行的排序函数参数?以下是一些示例测试代码: class SortTest { def testSort () = { val myClass = new MyClass(0) val list = List (myClass, new
class SortTest {
def testSort () = {
val myClass = new MyClass(0)
val list = List (myClass, new MyClass(1), new MyClass(2), new MyClass(3), new MyClass(4))
// Want to sort by value attribute, but don't want to sort right away. Rather
// how do I save the sort function, and retrieve it at a later time for execution?
list.sortBy(_.value)
// save the sort function (i.e. sort by the value attribute of myClass)
// something similar to the following syntax
myClass.setSortFunction (_.value)
// retrieve the sort function and sort the list
list.sortBy(myClass.getSortFunction())
}
class MyClass (d:Int){
val value = d
val sortFunc = null
// what should be the signature of this function ?
def setSortFunction (sortFunc: ()) = {
this.sortFunc = sortFunc
}
// what should be the return type of this function?
def getSortFunction () = {
return sortFunc
}
}
}
你可以这样做:
val sortFunction = (x : { def value: Int } ) => x.value
list.sorted(myClass.getSortFunction)
此时,您可能对Int
的硬编码不满意。不幸的是,函数必须具有定义良好的类型,因此我不能对返回类型进行泛型
可以将其定义为:
def sortFunction[T] = (x : { def value: T } ) => x.value
但是,不能传递定义,只能传递值,不能参数化值
另一方面,您的做法是错误的-sortBy
假设函数是一个参数,并且仅此而已。不正确:sortBy
接受两个参数:函数和排序。如果不保存排序,则无法对其进行排序
现在我们来讨论另一个问题。。。函数必须具有类型MyClass=>T
,并且排序必须是类型ordering[T]
。如果事先不知道T
是什么,就无法保存它
幸运的是,Ordering
是个好主意,您只需创建一个Ordering[MyClass]
,然后使用它
以下是方法:
class MyClass(d: Int) {
val value = d
private var sortFunction: Ordering[MyClass] = _
def setSortFunction[T : Ordering](f: MyClass => T) {
sortFunction = Ordering by f
}
def getSortFunction = sortFunction
}
你是这样使用它的:
val sortFunction = (x : { def value: Int } ) => x.value
list.sorted(myClass.getSortFunction)
请注意,它使用的不是sortBy
,而是sorted
。sortBy
方法是通过创建一个Ordering
并使用它调用sorted
来实现的,因此不会损失任何性能。为什么不将此函数分配给变量呢?为什么不使用惰性集合?你想通过推迟排序来完成什么?