J'ai deux collections du même objet, Collection<Foo> oldSet
y Collection<Foo> newSet
. La logique requise est la suivante :
- si
foo
est dans(*)oldSet
mais pasnewSet
appeldoRemove(foo)
- sinon si
foo
n'est pas dansoldSet
mais ennewSet
appeldoAdd(foo)
- sinon si
foo
est dans les deux collections mais modifié, appelezdoUpdate(oldFoo, newFoo)
- sinon si
!foo.activated && foo.startDate >= now
appeldoStart(foo)
- sinon si
foo.activated && foo.endDate <= now
appeldoEnd(foo)
(*) "dans" signifie que l'identifiant unique correspond, pas nécessairement le contenu.
Le code actuel (hérité) effectue de nombreuses comparaisons pour déterminer removeSet
, addSet
, updateSet
, startSet
y endSet
puis boucle pour agir sur chaque élément.
Le code est assez désordonné (en partie parce que j'ai déjà laissé de côté une partie de la logique spaghetti) et j'essaie de le remanier. Quelques informations supplémentaires :
- Pour autant que je sache, le
oldSet
ynewSet
sont en fait soutenus parArrayList
- Chaque ensemble contient moins de 100 éléments, probablement 20 au maximum.
- Ce code est appelé fréquemment (mesuré en millions/jour), bien que les ensembles diffèrent rarement.
Mes questions :
- Si je convertis
oldSet
ynewSet
enHashMap<Foo>
(l'ordre n'a pas d'importance ici), avec les ID comme clés, le code serait-il plus facile à lire et à comparer ? Quelle est la perte de temps et de performance mémoire lors de la conversion ? - Le fait d'itérer les deux ensembles et d'effectuer l'opération appropriée serait-il plus efficace et plus concis ?