Ich habe ein Objekt, wie folgend:Überschneidung zwischen zwei HashSets in Java 8
public Class MyObjDTO {
private Long id;
private Boolean checked;
//getter and setters
@Override
public final int hashCode() {
Long id = getId();
return (id == null ? super.hashCode() : id.hashCode());
}
@Override
public boolean equals(final Object obj) {
if (this == obj)
return true;
if (!(obj instanceof MyObjDTO))
return false;
Long id = getId();
Long objId = ((MyObjDTO) obj).getId();
if (id.equals(objId)) {
return true;
} else {
return false;
}
}
}
Und ich habe zwei Hash-Sets einige Beispiele aus diesem Objekt enthält:
HashSet oldSet = new HashSet();
oldSet.add(new MyObjDTO(1,true));
oldSet.add(new MyObjDTO(2,true));
oldSet.add(new MyObjDTO(3,false));
HashSet newSet = new HashSet();
newSet.add(new MyObjDTO(1,false));
newSet.add(new MyObjDTO(2,true));
newSet.add(new MyObjDTO(4,true));
Also, was ich tun möchte, hier ist es, Objekte auszuwählen, die in den newSet
und nicht in den oldSet
, in diesem Fall sind seine: new MyObjDTO(4,true)
, die ich dies habe mit:
Stream<MyObjDTO> toInsert = newSet.stream().filter(e -> !oldSet.contains(e));
Dann möchte ich Objekte auszuwählen, die in der oldSet
sind und nicht in der newSet
, seine in diesem Fall: new MyObjDTO(3,false)
, die ich tat dies mit:
Stream<MyObjDTO> toRemove = oldSet.stream().filter(e -> !newSet.contains(e));
Der letzte Schritt besteht darin, dass ich die Objekte auswählen möchten das ist in newSet und oldSet, aber sie haben einen anderen Wert für das Attribut checked
, in diesem Fall ist es: new MyObjDTO(1,false)
. Was ich versucht, ist dies:
Stream<MyObjDTO> toUpdate = oldSet.stream().filter(newSet::contains);
Aber dieser wird sowohl new MyObjDTO(1,false)
und new MyObjDTO(2,true)
zurück.
Wie kann ich das lösen?
Was wird mich mit diesen Strömen tun? – Holger
@Holger Einfügen, Entfernen oder Aktualisieren meiner Objekte in der Datenbank. –
Brauchen Sie die Kreuzung zwischen zwei 'Set's? Warum nicht die alte und zuverlässige Methode 'retainAll' verwenden? Entsprechend 'Set' javadoc, wenn das Argument, das an die' retainAll'-Methode übergeben wird, ebenfalls eine Menge ist, ist das Ergebnis die Schnittmenge von ihnen. – STaefi