Ich verwende diese Zeile hier, um eine Liste basierend auf dem Objektnamen zu sortieren.
%Vor%Wie sortiere ich es basierend auf "name", wenn es existiert, wenn nicht, ich möchte es nach "title" sortieren. Wenn beide existieren, möchte ich zuerst nach "name" und dann nach "title" sortieren.
Ich bin kein Groovy-Programmierer, also danke für die Hilfe im Voraus.
Ich bin mir nicht sicher, ob ich deine Frage richtig verstanden habe. Vielleicht ist etwas wie das, was Sie suchen:
%Vor%Was in dieser scheinbar harmlosen Vergleichsfunktion passiert, ist eigentlich eine Menge Groovy-Syntax-Magie. Aber es ist nicht schwer zu folgen.
Zunächst wird die sort
-Methode mit einer Binärfunktion aufgerufen, die als fungiert ein Komparator (dh nimmt zwei Argumente, a und b und gibt -1 zurück, wenn a & lt; b, 1 wenn a & gt; b und 0 wenn a == b).
Diese anonyme Funktion: { a, b -> a.name <=> b.name ?: a.title <=> b.title }
benutzt den " Raumschiffoperator " ( <=>
... das ist ein Raumschiff Mann!), zuerst a und b mit Namen zu vergleichen.
Wenn die Namen gleich (oder beide Null) sind, dann ist das Ergebnis von a.name <=> b.name
0, was fälschlicherweise in "Elvis-Betreiber "( ?:
... stelle es sich als Smiley vor), dann wird das Ergebnis von a.title <=> b.title
zurückgegeben.
Andernfalls, wenn das Ergebnis des Namensvergleichs nicht 0 ist, wird das im Elvis-Operator wahrheitsgemäß ausgewertet, und dieser Wert wird zurückgegeben.
Dies alles berücksichtigt, dass Sie Nullwerte mit Zeichenfolgen vergleichen können und dass 'any string' > null
immer gilt (was dasselbe ist wie 'any string' <=> null == 1
).
Das Endergebnis ist also, dass Elemente ohne Namen zuerst und nach Titel sortiert werden und dann die Elemente mit Namen und Titel zuerst nach Namen und dann nach Titel sortiert werden.
Ich hoffe, dass Sie danach gesucht haben. Wenn Sie eine andere Sortierung der sortierten Elemente erwarten würden, können Sie dies in den Kommentaren klären:)
Es gibt auch ein nicht sehr dokumentiertes Objekt OrderBy
das kann in diesem Fall verwendet werden: