📄 multivaluemap.java
字号:
/**
* Override superclass to ensure that MultiMap instances are
* correctly handled.
* <p>
* If you call this method with a normal map, each entry is
* added using <code>put(Object,Object)</code>.
* If you call this method with a multi map, each entry is
* added using <code>putAll(Object,Collection)</code>.
*
* @param map the map to copy (either a normal or multi map)
*/
public void putAll(Map map) {
if (map instanceof MultiMap) {
for (Iterator it = map.entrySet().iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry) it.next();
Collection coll = (Collection) entry.getValue();
putAll(entry.getKey(), coll);
}
} else {
for (Iterator it = map.entrySet().iterator(); it.hasNext();) {
Map.Entry entry = (Map.Entry) it.next();
put(entry.getKey(), entry.getValue());
}
}
}
/**
* Gets a collection containing all the values in the map.
* <p>
* This returns a collection containing the combination of values from all keys.
*
* @return a collection view of the values contained in this map
*/
public Collection values() {
Collection vs = values;
return (vs != null ? vs : (values = new Values()));
}
/**
* Checks whether the collection at the specified key contains the value.
*
* @param value the value to search for
* @return true if the map contains the value
*/
public boolean containsValue(Object key, Object value) {
Collection coll = getCollection(key);
if (coll == null) {
return false;
}
return coll.contains(value);
}
/**
* Gets the collection mapped to the specified key.
* This method is a convenience method to typecast the result of <code>get(key)</code>.
*
* @param key the key to retrieve
* @return the collection mapped to the key, null if no mapping
*/
public Collection getCollection(Object key) {
return (Collection) getMap().get(key);
}
/**
* Gets the size of the collection mapped to the specified key.
*
* @param key the key to get size for
* @return the size of the collection at the key, zero if key not in map
*/
public int size(Object key) {
Collection coll = getCollection(key);
if (coll == null) {
return 0;
}
return coll.size();
}
/**
* Adds a collection of values to the collection associated with
* the specified key.
*
* @param key the key to store against
* @param values the values to add to the collection at the key, null ignored
* @return true if this map changed
*/
public boolean putAll(Object key, Collection values) {
if (values == null || values.size() == 0) {
return false;
}
Collection coll = getCollection(key);
if (coll == null) {
coll = createCollection(values.size());
boolean result = coll.addAll(values);
if (coll.size() > 0) {
// only add if non-zero size to maintain class state
getMap().put(key, coll);
result = false;
}
return result;
} else {
return coll.addAll(values);
}
}
/**
* Gets an iterator for the collection mapped to the specified key.
*
* @param key the key to get an iterator for
* @return the iterator of the collection at the key, empty iterator if key not in map
*/
public Iterator iterator(Object key) {
if (!containsKey(key)) {
return EmptyIterator.INSTANCE;
} else {
return new ValuesIterator(key);
}
}
/**
* Gets the total size of the map by counting all the values.
*
* @return the total size of the map counting all values
*/
public int totalSize() {
int total = 0;
Collection values = getMap().values();
for (Iterator it = values.iterator(); it.hasNext();) {
Collection coll = (Collection) it.next();
total += coll.size();
}
return total;
}
/**
* Creates a new instance of the map value Collection container
* using the factory.
* <p>
* This method can be overridden to perform your own processing
* instead of using the factory.
*
* @param size the collection size that is about to be added
* @return the new collection
*/
protected Collection createCollection(int size) {
return (Collection) collectionFactory.create();
}
//-----------------------------------------------------------------------
/**
* Inner class that provides the values view.
*/
private class Values extends AbstractCollection {
public Iterator iterator() {
final IteratorChain chain = new IteratorChain();
for (Iterator it = keySet().iterator(); it.hasNext();) {
chain.addIterator(new ValuesIterator(it.next()));
}
return chain;
}
public int size() {
return totalSize();
}
public void clear() {
MultiValueMap.this.clear();
}
}
/**
* Inner class that provides the values iterator.
*/
private class ValuesIterator implements Iterator {
private final Object key;
private final Collection values;
private final Iterator iterator;
public ValuesIterator(Object key) {
this.key = key;
this.values = getCollection(key);
this.iterator = values.iterator();
}
public void remove() {
iterator.remove();
if (values.isEmpty()) {
MultiValueMap.this.remove(key);
}
}
public boolean hasNext() {
return iterator.hasNext();
}
public Object next() {
return iterator.next();
}
}
/**
* Inner class that provides a simple reflection factory.
*/
private static class ReflectionFactory implements Factory {
private final Class clazz;
public ReflectionFactory(Class clazz) {
this.clazz = clazz;
}
public Object create() {
try {
return clazz.newInstance();
} catch (Exception ex) {
throw new FunctorException("Cannot instantiate class: " + clazz, ex);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -