Java 8: Effizienterer Weg zum Vergleichen von Listen verschiedener Typen?

9

In einem Komponententest möchte ich überprüfen, dass zwei Listen die gleichen Elemente enthalten. Die zu testende Liste besteht aus einer Liste von Person -Objekten, wobei ein Feld vom Typ String extrahiert wird. Die andere Liste enthält String Literale.

Oft findet man das folgende Code-Snippet, um diese Aufgabe zu erledigen (siehe diese Antwort ):

%Vor%

Die Person -Klasse ist definiert als:

%Vor%

Im obigen Beispiel wird die Liste der Personen (oder Personen) in eine Liste von Strings umgewandelt, die Java 8-Techniken verwenden, und der Vergleich wird auf altmodische Weise durchgeführt.

Nun frage ich mich, ob es einen direkteren oder effizienteren Weg gibt, den Vergleich mit anderen Java-8-Anweisungen zu machen, zum Beispiel allMatch() oder etwas Predicate<T> oder etwas anderes.

    
Sebastian S. 19.05.2015, 16:04
quelle

2 Antworten

14

Der Code Ihrer Frage spiegelt nicht, was Sie in den Kommentaren beschreiben. In den Kommentaren sagen Sie, dass alle Namen vorhanden sein sollten und die Größe übereinstimmen sollte, mit anderen Worten, nur die Reihenfolge kann anders sein.

Ihr Code ist

%Vor%

Es fehlt ein Test für die Größe von people , dh Duplikate sind möglich. Des Weiteren ist die Verwendung von containsAll , das zwei List s kombiniert, sehr ineffizient. Es ist viel besser, wenn Sie einen Sammlertyp verwenden, der Ihre Absicht widerspiegelt, d. H. Keine Duplikate hat, sich nicht um eine Bestellung kümmert und eine effiziente Suche hat:

%Vor%

Bei dieser Lösung müssen Sie nicht manuell auf die Größe testen. Es wird bereits vorausgesetzt, dass die Gruppen die gleiche Größe haben, wenn sie übereinstimmen. Nur die Reihenfolge kann unterschiedlich sein.

Es gibt eine Lösung, bei der die Namen von persons nicht erfasst werden müssen:

%Vor%

funktioniert aber nur, wenn expectedNames eine temporäre Menge ist, die aus der statischen Sammlung erwarteter Namen erstellt wurde. Sobald Sie sich entschließen, Ihre statische Sammlung durch Set zu ersetzen, benötigt die erste Lösung keinen temporären Satz und letzterer hat keinen Vorteil mehr.

    
Holger 20.05.2015, 09:43
quelle
4

Wenn die Anzahl der Elemente gleich sein muss, dann wäre es besser, Sets zu vergleichen:

%Vor%

Die equals -Methode für korrekt implementierte Mengen sollte in der Lage sein, verschiedene Arten von Mengen zu vergleichen: Sie prüft nur, ob der Inhalt derselbe ist (ignorieren Sie die Reihenfolge des Kurses).

Die Verwendung von assertEquals ist bequemer, da im Falle eines Fehlers eine Fehlermeldung die Zeichenfolgendarstellung Ihres Sets enthält.

    
Tagir Valeev 20.05.2015 09:34
quelle