Ho bisogno di unire tutti gli elementi di una lista B in un'altra lista listaA.java 8 unire tutti gli elementi di ListB in ListA se non presenti
Se un elemento è già presente (basato su un controllo di uguaglianza personalizzato) nell'elenco A Non voglio aggiungerlo.
Non voglio usare Set, e non voglio sovrascrivere equals() e hashCode().
I motivi sono, non voglio impedire i duplicati in listA di per sé, voglio solo non unire da listB se ci sono già elementi in listA che considero uguali.
Non voglio eseguire l'override di equals() e hashCode() poiché ciò significherebbe che è necessario verificare che la mia implementazione di equals() per gli elementi sia valida in ogni circostanza. Potrebbe tuttavia essere che gli elementi di listB non sono completamente inizializzati, ovvero potrebbero mancare un ID oggetto, dove potrebbe essere presente in elementi di listA.
mio approccio attuale comporta un'interfaccia e un programma di utilità-Function:
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())
);
}
}
E poi userei in questo modo:
...
List<AppleVariety> appleVarietiesFromOnePlace = ... init here with some elements
List<AppleVariety> appleVarietiesFromAnotherPlace = ... init here with some elements
CollectionUtils.merge(appleVarietiesFromOnePlace, appleVarietiesFromAnotherPlace);
...
per ottenere la mia nuova lista in elencoA con tutti gli elementi fusi da B.
È un buon approccio? C'è un modo migliore/più semplice per realizzare lo stesso?
Grazie, ho già applicato il tuo suggerimento con BiPredicate ed eliminato l'interfaccia. Analizzerò anche il tuo secondo suggerimento più tardi: utilizzare una classe wrapper per poter eseguire l'override di equals e hashCode in un contesto specifico è un'ottima idea. – SebastianRiemer