list B listesindeki tüm öğeleri listeA listesine ekleyin.java 8 ListB öğesinin tüm öğelerini ListA'ya birleştirin
listeA listesinde bir öğe zaten varsa (özel bir eşitlik denetimine bağlı olarak) eklemek istemiyorum.
Ben Set kullanmak istemiyorum, ben() ve hashCode() eşittir geçersiz kılmak istemiyoruz.
Nedenleri Ben sadece eşit olmayı düşünür Lista öğeler zaten varsa ListB dan birleştirmezseniz istiyorum, listA başına çiftleri önlemek istemiyorum vardır.
Eşittir() ve hashCode() öğesini geçersiz kılmak istemiyorum çünkü bu, öğelerin her koşulda tuttuğuna dair eşittir() öğemi uyguladığımdan emin olmak zorundayım. Bununla birlikte, listB'den gelen elemanların tam olarak başlatılmadığı, yani, listA öğelerinde var olabilecekleri bir nesne kimliğini kaçırabilecekleri de olabilir.
Benim şu anki yaklaşım bir arayüz ve Fayda-Fonksiyonu içerir:
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())
);
}
}
Sonra bu gibi kullanmak istiyorum:
...
List<AppleVariety> appleVarietiesFromOnePlace = ... init here with some elements
List<AppleVariety> appleVarietiesFromAnotherPlace = ... init here with some elements
CollectionUtils.merge(appleVarietiesFromOnePlace, appleVarietiesFromAnotherPlace);
...
tüm unsurları ile Lista benim yeni listesini almak için B'den birleşti
bu iyi bir yaklaşım var mı? Bunu başarmanın daha iyi/daha kolay bir yolu var mı? Bir HasEqualityFunction
arayüzü gerekmez
public static <T> void merge(List<T> listA, List<T> listB, BiPredicate<T, T> areEqual) {
listA.addAll(listB.stream()
.filter(t -> listA.stream().noneMatch(u -> areEqual.test(t, u)))
.collect(Collectors.toList())
);
}
:
Teşekkürler, önerinizi BiPredicate ile zaten uyguladım ve Arayüzü elimine ettim. 2. öneriye daha sonra da bakacağım - bir sargı sınıfını kullanarak eşitliği geçersiz kılacak ve belirli bir bağlamda hashCode'u kullanmak harika bir fikir. – SebastianRiemer