Tôi cần hợp nhất tất cả các thành phần của danh sách B vào danh sách khác listA.java 8 hợp nhất tất cả các phần tử của ListB vào ListA nếu không có mặt
Nếu một phần tử đã có mặt (dựa trên kiểm tra bình đẳng tùy chỉnh) trong listA Tôi không muốn thêm nó.
Tôi không muốn sử dụng Đặt và tôi không muốn ghi đè bằng() và hashCode().
Lý do là, tôi không muốn ngăn trùng lặp trong listA cho mỗi lần, tôi chỉ muốn không hợp nhất từ listB nếu đã có các phần tử trong listA mà tôi xem là bằng nhau.
Tôi không muốn ghi đè bằng() và hashCode() vì điều đó có nghĩa là tôi cần đảm bảo, việc triển khai bằng() cho các phần tử được giữ trong mọi trường hợp. Tuy nhiên, có thể các phần tử từ listB không được khởi tạo đầy đủ, tức là chúng có thể bỏ sót một id đối tượng, trong đó các phần tử có thể có trong các phần tử của listA.
cách tiếp cận hiện tại của tôi liên quan đến một giao diện và một Utility-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())
);
}
}
Và sau đó tôi muốn sử dụng nó như thế này:
...
List<AppleVariety> appleVarietiesFromOnePlace = ... init here with some elements
List<AppleVariety> appleVarietiesFromAnotherPlace = ... init here with some elements
CollectionUtils.merge(appleVarietiesFromOnePlace, appleVarietiesFromAnotherPlace);
...
để có được danh sách mới của tôi trong Lista với tất cả các yếu tố được hợp nhất từ B.
Đây có phải là cách tiếp cận tốt không? Có cách nào tốt hơn/dễ hơn để thực hiện tương tự không?
Cảm ơn, tôi đã áp dụng đề xuất của bạn với BiPredicate và loại bỏ Giao diện. Tôi cũng sẽ xem xét đề xuất thứ hai của bạn sau - sử dụng lớp trình bao bọc để có thể ghi đè bằng và hashCode trong một ngữ cảnh cụ thể là một ý tưởng tuyệt vời. – SebastianRiemer