HashingStrategy - это концепция, которую вы ищете.Это интерфейс стратегии, который позволяет вам определять пользовательские реализации equals и hashcode.
public interface HashingStrategy<E>
{
int computeHashCode(E object);
boolean equals(E object1, E object2);
}
Eclipse Collections включает в себя хеш-таблицы, а также шаблоны итераций на основе стратегий хеширования.Во-первых, вы должны создать свой собственный HashingStrategy
, чтобы ответить, равны ли два Books
.
Далее, вы будете использовать distinct()
для удаления дубликатов в пределах newBooks
и UnifiedSetWithHashingStrategy
для устранениядублирует списки.
List<Book> oldBooks = ...;
List<Book> newBooks = ...;
HashingStrategy<Book> hashingStrategy = new HashingStrategy() { ... };
Set<Book> set = UnifiedSetWithHashingStrategy<>(hashingStrategy, oldBooks);
List<Book> result = ListIterate.distinct(newBooks, hashingStrategy).reject(set::contains);
Метод distinct()
возвращает только уникальные элементы в соответствии со стратегией хеширования.Возвращает список, а не набор, сохраняя исходный порядок.Вызов reject()
возвращает другой новый список без элементов, содержащихся в наборе, в соответствии с той же стратегией хеширования.
Если вы можете изменить newBooks для реализации интерфейса Eclipse Collections, то вы можете вызвать distinct()
метод напрямую.
MutableList<Book> newBooks = ...;
MutableList<Book> result = newBooks.distinct(hashingStrategy).reject(oldBooks::contains);
Примечание: я являюсь коммиттером для Eclipse Collections.