Ich muss alle Elemente einer listB in eine andere Liste listA zusammenführen.java 8 alle Elemente von ListB in ListA zusammenfassen, wenn nicht vorhanden
Wenn ein Element bereits vorhanden ist (basierend auf einer benutzerdefinierten Gleichheitsüberprüfung) in listA Ich möchte es nicht hinzufügen.
Ich möchte Set nicht verwenden, und ich möchte nicht gleich() und hashCode() überschreiben.
Gründe, ich will nicht verhindern, dass Duplikate in listA an sich, ich möchte nur nicht von listB fusionieren, wenn es bereits Elemente in listA gibt, die ich für gleich halte.
Ich möchte equals() und hashCode() nicht überschreiben, denn das würde bedeuten, dass ich sicherstellen muss, dass meine Implementierung von equals() für die Elemente in jedem Fall gilt. Es kann jedoch sein, dass Elemente von listB nicht vollständig initialisiert sind, d. H. Sie können eine Objekt-ID vermissen, wenn diese in Elementen von listA vorhanden ist.
Mein aktueller Ansatz beinhaltet eine Schnittstelle und eine Utility-Funktion:
public interface HasEqualityFunction<T> {
public boolean hasEqualData(T other);
}
public class AppleVariety implements HasEqualityFunction<AppleVariety> {
private String manufacturerName;
private String varietyName;
@Override
public boolean hasEqualData(AppleVariety other) {
return (this.manufacturerName.equals(other.getManufacturerName())
&& this.varietyName.equals(other.getVarietyName()));
}
// ... getter-Methods here
}
public class CollectionUtils {
public static <T extends HasEqualityFunction> void merge(
List<T> listA,
List<T> listB) {
if (listB.isEmpty()) {
return;
}
Predicate<T> exists
= (T x) -> {
return listA.stream().noneMatch(
x::hasEqualData);
};
listA.addAll(listB.stream()
.filter(exists)
.collect(Collectors.toList())
);
}
}
Und dann würde ich es wie folgt verwendet werden:
...
List<AppleVariety> appleVarietiesFromOnePlace = ... init here with some elements
List<AppleVariety> appleVarietiesFromAnotherPlace = ... init here with some elements
CollectionUtils.merge(appleVarietiesFromOnePlace, appleVarietiesFromAnotherPlace);
...
auf meine neue Liste in listA mit allen Elementen zu erhalten fusioniert von B.
Ist das ein guter Ansatz? Gibt es einen besseren/leichteren Weg, das Gleiche zu erreichen?
Danke, ich habe Ihren Vorschlag bereits mit dem BiPredicate übernommen und das Interface beseitigt. Ich werde später auch auf Ihren zweiten Vorschlag eingehen - eine Wrapper-Klasse zu verwenden, um equals überschreiben zu können, und hashCode in einem bestimmten Kontext ist eine großartige Idee. – SebastianRiemer