У меня есть две коллекции одного и того же объекта, 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>
(порядок здесь не беспокоит), с идентификаторами в качестве ключей, облегчит ли его чтение и будет легче сравнивать? Сколько времени и производительности памяти является потерей при конвертации? - Итерация двух наборов и выполнение соответствующей операции будет более эффективной и лаконичной?