brainbaking/content/wiki/code/java/dynamica/listmerger.md

263 lines
7.6 KiB
Markdown
Raw Normal View History

2017-02-26 13:28:18 +01:00
+++
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<ItemType, ItemTypeAfterConversion> {
private final Function<ItemType, ItemTypeAfterConversion> itemConverterFn;
public ListMerger() {
this.itemConverterFn = identityFn();
}
public ListMerger(Function<ItemType, ItemTypeAfterConversion> itemConverterFn) {
this.itemConverterFn = itemConverterFn;
}
private Function<ItemType, ItemTypeAfterConversion> identityFn() {
return new Function<ItemType, ItemTypeAfterConversion>() {
@SuppressWarnings("unchecked")
@Override
public ItemTypeAfterConversion apply(ItemType input) {
return (ItemTypeAfterConversion) input;
}
};
}
public final void mergeLists(List<? extends ItemType> oldList, List<? extends ItemType> newList, ListMergable<ItemType> mergable) {
List<ItemTypeAfterConversion> oldTransformed = new ArrayList<ItemTypeAfterConversion>(transform(oldList, itemConverterFn));
List<ItemTypeAfterConversion> newTransformed = new ArrayList<ItemTypeAfterConversion>(transform(newList, itemConverterFn));
for (ItemType item : new ArrayList<ItemType>(oldList)) {
if (!newTransformed.contains(itemConverterFn.apply(item))) {
mergable.itemHasBeenRemoved(item);
} else {
mergable.itemHasBeenChangedInOldList(item);
}
}
for (ItemType item : new ArrayList<ItemType>(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<Integer, Long>(intToLongFn()).mergeLists(Lists.newArrayList(1, 3), Lists.newArrayList(1, 3), new ListMergable<Integer>() {
@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<Integer, Integer>().mergeLists(Lists.newArrayList(1, 3), Lists.newArrayList(1, 2, 3), new ListMergable<Integer>() {
@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<Integer, Long>(intToLongFn()).mergeLists(Lists.newArrayList(1, 3), Lists.newArrayList(1, 2, 3), new ListMergable<Integer>() {
@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<Integer, Integer>().mergeLists(Lists.newArrayList(1, 3), Lists.newArrayList(1), new ListMergable<Integer>() {
@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<Integer, Long>(intToLongFn()).mergeLists(Lists.newArrayList(1, 2, 3), Lists.newArrayList(1, 3), new ListMergable<Integer>() {
@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<Integer, Long> intToLongFn() {
return new Function<Integer, Long>() {
@Override
public Long apply(Integer input) {
return new Long(input);
}
};
}
}
```
Voorbeeld van gebruik:
```java
final List<Location> removedLocations = new ArrayList<Location>();
final List<Location> addedLocations = new ArrayList<Location>();
new ListMerger<Location, Location>().mergeLists(oldLocations, carpark.getLocations(), new ListMergable<Location>() {
@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);
}
```