У меня есть две коллекции одного и того же объекта, Collection<Foo> oldSet и Collection<Foo> newSet. Требуемая логика следующая:
- Если
fooнаходится в (*)oldSet, но неnewSet, вызовитеdoRemove(foo) - else, если
fooне находится вoldSet, но вnewSet, вызовитеdoAdd(foo) - else, если
fooнаходится в обеих коллекциях, но изменен, вызовитеdoUpdate(oldFoo, newFoo) - else if
!foo.activated && foo.startDate >= now, вызовdoStart(foo) - else if
foo.activated && foo.endDate <= now, вызовdoEnd(foo)
(*) "in" означает, что уникальный идентификатор совпадает, не обязательно, содержимое.
Текущий (устаревший) код выполняет множество сравнений, чтобы определить removeSet, addSet, updateSet, startSet и endSet, а затем цикл для каждого элемента.
Код довольно грязный (отчасти потому, что я уже оставил некоторую логику спагетти), и я пытаюсь его реорганизовать. Дополнительная информация:
- Насколько я знаю,
oldSetиnewSetна самом деле поддерживаютсяArrayList - Каждый набор содержит менее 100 наименований, скорее всего, максимум в 20
- Этот код часто называется (измеряется в миллионы/день), хотя наборы редко отличаются
Мои вопросы:
- Если я конвертирую
oldSetиnewSetвHashMap<Foo>(порядок здесь не беспокоит), с идентификаторами в качестве ключей, облегчит ли его чтение и будет легче сравнивать? Сколько времени и производительности памяти является потерей при конвертации? - Итерация двух наборов и выполнение соответствующей операции будет более эффективной и лаконичной?