2016-08-03 56 views
0

Ich versuche, eine eindeutige Liste zu erstellen. Ich kann kein "Set" verwenden, da ich einige der Werte zuweisen muss, während ich es iteriere.Was ist der beste Weg, um eine Liste von "einzigartigen" Objekten in Java zu erstellen

Im Moment mache ich das, um eine einzigartige Liste zu erstellen. Kennt jemand einen besseren Weg?

List<Thing> things = previousThings.stream() 
         .collect(Collectors.toSet()).stream() 
         .collect(Collectors.toList()); 

Ich dachte, dass, wenn ich es zu einem Set und der Rückseite zu einer Liste umwande, es doppelte Einträge beseitigen würde. Ich denke, es muss eine Liste sein, damit ich "List.set (..)" verwenden kann, um zu aktualisieren, was möglicherweise bereits in meinem Repository ist.

for(int i = 0; i < things.size(); i++) { 
    if(things.get(i).id == null) { 
    existingThing = thingRepository.getByName(things.get(i).getName()); 
    if(existingThing != null) { 
     things.set(i, existingThing); 
    } else { 
     things.set(i, thingRepository.save(things.get(i)); 
    } 
    } 
} 
+3

Ersetzen '.collect (Collectors.toSet()). Strom()' 'mit .distinct()' –

+0

, die normalerweise funktionieren würde, aber ich sollte erwähnt habe, dass ich eine andere Methode als die verwenden müssen .equals() für den Vergleich, da id verwendet wird und ich nach eindeutigen Namen suche. Gibt es eine ähnliche Methode, mit der Sie ein Lambda zum Vergleich bereitstellen können? @LouisWasserman –

+0

Was nennst du "einzigartig"? Basierend auf der Methode 'equals()'? Sind sie unveränderlich? – lvr123

Antwort

0

dachte ich vor, dass ich nicht in der Lage sein, die .distinct() zu verwenden, weil es .equals() verwendet, die aus der ‚Thing.id‘ basiert und einige der ‚Dinge‘ don‘ Ich habe noch eine ID. Dann wurde mir klar, dass am Ende des forLoop alles vom Repository mit einer ID versehen ist.

List<Thing> things = previousThings; 
for(int i = 0; i < things.size(); i++) { 
    if(things.get(i).id == null) { 
    existingThing = thingRepository.getByName(things.get(i).getName()); 
    if(existingThing != null) { 
     things.set(i, existingThing); 
    } else { 
     things.set(i, thingRepository.save(things.get(i)); 
    } 
    } 
} 
List<Thing> distinctThings = things.stream().distinct().collect(Collectors.toList);