我知道这似乎是一个愚蠢的问题,但我无法弄清楚是什么
def Nodes = Node.findAllByParent(theNode).sort{ a, b -> a.label <=> b.label }
呢? Node类包含标签和其他属性。我想知道上面这行中的那种东西是做什么的。 theNode就像一个有子节点的父节点。和它有什么不同
def Nodes = Node.findAllByParent(theNode,sort['label'])
答案 0 :(得分:3)
a <=> b
是
的简写a.compareTo(b)
本身相当于:
if (a > b) {
return 1
} else if (a < b) {
return -1
} else {
// a and b are equal
return 0
}
之间的区别
def Nodes = Node.findAllByParent(theNode).sort{ a, b -> a.label <=> b.label }
和
def Nodes = Node.findAllByParent(theNode,sort['label'])
是第一个在内存中进行排序,而在第二种情况下,节点按查询的排序顺序返回。通常,您应该让数据库尽可能地进行排序。
顺便说一句,我认为上面的第二个参数应该是[sort: "label"]
而不是sort['label']
。
答案 1 :(得分:1)
第一个sort
在集合上作为Groovy排序完成,而第二个使用数据源的排序功能(例如数据库ORDER BY)。
<=>
被称为宇宙飞船运营商。运算符是引用Comparable接口的compareTo方法的另一种方式。这意味着我们可以在我们自己的类中实现compareTo方法,这将允许我们使用&lt; =&gt;我们代码中的运算符。当然,所有已经实现了compareTo方法的类都可以与宇宙飞船运营商一起使用。运算符提供了良好的可读排序方法。
例如:
class Person implements Comparable {
String username
String email
int compareTo(other) {
this.username <=> other.username
}
}
assert -1 == ('a' <=> 'b')
assert 0 == (42 <=> 42)
assert -1 == (new Person([username:'foo', email: 'test@email.com']) <=> new Person([username:'zebra', email:'tester@email.com']))
assert [1, 2, 3, 4] == [4, 2, 1, 3].sort{ a, b -> a <=> b }