+++ title = "listmerger" draft = false tags = [ "", "Users", "jefklak", "Downloads", "pages", "code", "java", "dynamica", "listmerger" ] date = "2013-03-12" +++ # code:java:dynamica >> Listmerger ```java public final class ListMerger { private final Function itemConverterFn; public ListMerger() { this.itemConverterFn = identityFn(); } public ListMerger(Function itemConverterFn) { this.itemConverterFn = itemConverterFn; } private Function identityFn() { return new Function() { @SuppressWarnings("unchecked") @Override public ItemTypeAfterConversion apply(ItemType input) { return (ItemTypeAfterConversion) input; } }; } public final void mergeLists(List oldList, List newList, ListMergable mergable) { List oldTransformed = new ArrayList(transform(oldList, itemConverterFn)); List newTransformed = new ArrayList(transform(newList, itemConverterFn)); for (ItemType item : new ArrayList(oldList)) { if (!newTransformed.contains(itemConverterFn.apply(item))) { mergable.itemHasBeenRemoved(item); } else { mergable.itemHasBeenChangedInOldList(item); } } for (ItemType item : new ArrayList(newList)) { if (!oldTransformed.contains(itemConverterFn.apply(item))) { mergable.itemHasBeenAdded(item); } else { mergable.itemHasBeenChangedInNewList(item); } } } } ``` En de test: ```java public class ListMergerTest { private AtomicInteger integer = null; private AtomicInteger amount = null; @Before public void setUp() { this.integer = new AtomicInteger(); this.amount = new AtomicInteger(0); } @Test public void noItemsChanged() { new ListMerger(intToLongFn()).mergeLists(Lists.newArrayList(1, 3), Lists.newArrayList(1, 3), new ListMergable() { @Override public void itemHasBeenRemoved(Integer item) { throw new UnsupportedOperationException(); } @Override public void itemHasBeenChangedInOldList(Integer item) { amount.set(amount.get() + 1); } @Override public void itemHasBeenChangedInNewList(Integer item) { } @Override public void itemHasBeenAdded(Integer item) { throw new UnsupportedOperationException(); } }); assertThat(amount.get()).isEqualTo(2); } @Test public void itemHasBeenAddedUsingIdentity() { new ListMerger().mergeLists(Lists.newArrayList(1, 3), Lists.newArrayList(1, 2, 3), new ListMergable() { @Override public void itemHasBeenRemoved(Integer item) { throw new UnsupportedOperationException(); } @Override public void itemHasBeenChangedInOldList(Integer item) { } @Override public void itemHasBeenChangedInNewList(Integer item) { } @Override public void itemHasBeenAdded(Integer item) { integer.set(item); amount.set(amount.get() + 1); } }); assertThat(amount.get()).isEqualTo(1); assertThat(integer.get()).isEqualTo(2); } @Test public void itemHasBeenAdded() { new ListMerger(intToLongFn()).mergeLists(Lists.newArrayList(1, 3), Lists.newArrayList(1, 2, 3), new ListMergable() { @Override public void itemHasBeenRemoved(Integer item) { throw new UnsupportedOperationException(); } @Override public void itemHasBeenChangedInOldList(Integer item) { } @Override public void itemHasBeenChangedInNewList(Integer item) { } @Override public void itemHasBeenAdded(Integer item) { integer.set(item); amount.set(amount.get() + 1); } }); assertThat(amount.get()).isEqualTo(1); assertThat(integer.get()).isEqualTo(2); } @Test public void itemHasBeenRemovedUsingIdentity() { new ListMerger().mergeLists(Lists.newArrayList(1, 3), Lists.newArrayList(1), new ListMergable() { @Override public void itemHasBeenRemoved(Integer item) { integer.set(item); amount.set(amount.get() + 1); } @Override public void itemHasBeenChangedInOldList(Integer item) { } @Override public void itemHasBeenChangedInNewList(Integer item) { } @Override public void itemHasBeenAdded(Integer item) { throw new UnsupportedOperationException(); } }); assertThat(amount.get()).isEqualTo(1); assertThat(integer.get()).isEqualTo(3); } @Test public void itemHasBeenRemoved() { new ListMerger(intToLongFn()).mergeLists(Lists.newArrayList(1, 2, 3), Lists.newArrayList(1, 3), new ListMergable() { @Override public void itemHasBeenRemoved(Integer item) { integer.set(item); amount.set(amount.get() + 1); } @Override public void itemHasBeenChangedInOldList(Integer item) { } @Override public void itemHasBeenChangedInNewList(Integer item) { } @Override public void itemHasBeenAdded(Integer item) { throw new UnsupportedOperationException(); } }); assertThat(amount.get()).isEqualTo(1); assertThat(integer.get()).isEqualTo(2); } private Function intToLongFn() { return new Function() { @Override public Long apply(Integer input) { return new Long(input); } }; } } ``` Voorbeeld van gebruik: ```java final List removedLocations = new ArrayList(); final List addedLocations = new ArrayList(); new ListMerger().mergeLists(oldLocations, carpark.getLocations(), new ListMergable() { @Override public void itemHasBeenAdded(Location item) { addedLocations.add(item); } @Override public void itemHasBeenRemoved(Location item) { removedLocations.add(item); } @Override public void itemHasBeenChangedInOldList(Location item) { } @Override public void itemHasBeenChangedInNewList(Location item) { } }); if (!removedLocations.isEmpty()) { crmImportGatewayService.forDeletion().sendCarparkLocations(carpark, removedLocations); } if (!addedLocations.isEmpty()) { crmImportGatewayService.forCreation().sendCarparkLocations(carpark, addedLocations); } ```