2012-09-25 12 views
23

Mi sto solo bagnando i piedi con il gremlin. Capisco che il gremlin si basa su groovy. Ho trovato la documentazione here, ma non sono ancora sicuro di cosa significhi la sintassi.ordinamento groovy con sintassi del comparatore

Io sono un po 'confuso su come la sintassi del tipo con un comparatore funziona:

m.sort{a,b -> a.value <=> b.value} 

Qualcuno potrebbe spiegare quello che tutti i vari bit tra il { e } significano?

risposta

40

Quando il Closure utilizzato da sort ha due parametri, si comporta come un tradizionale Comparator. Cioè, per ogni confronto effettuato durante l'ordinamento, tra due elementi a e b, lo restituisce un numero intero negativo, zero o un numero intero positivo poiché il primo argomento è inferiore, uguale o superiore al secondo .

Nel proprio scenario particolare, il confronto è il risultato dell'utilizzo di spaceship operator<=>. In altre parole, si stanno effettivamente ordinando i propri elementi nell'ordine ascendente.

Ad esempio, se si dispone della lista [ 3, 2, 1 ], il risultato dell'utilizzo di tale tipo would be[ 1, 2, 3 ].

Così, m.sort{a,b -> a.value <=> b.value} è approssimativamente l'equivalente di utilizzare la funzione seguente compare:

int compare(a, b) { 
    if (a < b) { 
    return -1; 
    } else if (a > b) { 
    return 1; 
    } else { 
    return 0; 
    } 
} 
+0

Così, il 'a, b ->', semplicemente passa i valori 'a' e' B' al comparatore? – F21

+0

@ F21: Sì, una specie di. È come una funzione che prende due parametri e viene utilizzata per ordinare in base al corpo della funzione che restituisce l'operatore dell'astronave. –

+0

Ottima spiegazione! Saluti :) – F21

4

L'operatore navicella <=> è un operatore sovraccaricato e rappresenta compareTo(). Fondamentalmente lo a<=>b è lo stesso di a.compareTo(b)

L'esempio che hai fornito utilizza la funzione sort() con una chiusura (come lambda in Java8). La sintassi perché è la seguente:

.method {closureParameters ->statements}

Così il vostro esempio, sta usando la funzione sort() con un closure, dentro che la chiusura si utilizza la navicella spaziale (di confronto) operatore

più su l'overloading degli operatori here

Problemi correlati