package com.tek271.funj;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Maps;
import com.google.common.collect.Multimap;
import java.util.Map;
public class CollectionTools {
public static <OBJ, PROP> Map<PROP, OBJ> toMap(Iterable<OBJ> it, String keyPropertyName) {
Map<PROP, OBJ> map = Maps.newHashMap();
return fillMap(it, keyPropertyName, map);
}
public static <OBJ, PROP> Multimap<PROP, OBJ> toMultimap(Iterable<OBJ> it, String keyPropertyName) {
Multimap<PROP, OBJ> map = ArrayListMultimap.create();
return fillMap(it, keyPropertyName, map);
}
private static <OBJ, PROP, MAP> MAP fillMap(Iterable<OBJ> it, String keyPropertyName, MAP mapObject) {
if (isEmpty(it)) return mapObject;
ReflectionTools.checkPropertyExists(it, keyPropertyName);
for (OBJ obj: it) {
PROP key = ReflectionTools.getPropertyValue(obj, keyPropertyName);
putValueInMap(mapObject, key, obj);
}
return mapObject;
}
@SuppressWarnings("unchecked")
private static <OBJ, PROP, MAP> void putValueInMap(MAP mapObject, PROP key, OBJ value) {
if (mapObject instanceof Map) {
Map<PROP, OBJ> map = (Map<PROP, OBJ>) mapObject;
map.put(key, value);
} else {
Multimap<PROP, OBJ> multimap = (Multimap<PROP, OBJ>) mapObject;
multimap.put(key, value);
}
}
public static <T> boolean isEmpty(Iterable<T> it) {
return it==null || !it.iterator().hasNext();
}
}