This commit is contained in:
Looly
2022-08-31 00:53:20 +08:00
parent 05bd3cca9f
commit 3bddce1a0b
4 changed files with 41 additions and 7 deletions

View File

@@ -20,6 +20,7 @@ import java.util.stream.Collectors;
* @param <V> 值类型
* @author looly
* @since 5.7.4
* @see CollectionValueMap
* @see SetValueMap
* @see ListValueMap
*/
@@ -60,7 +61,6 @@ public abstract class AbsCollValueMap<K, V> extends MapWrapper<K, Collection<V>>
// ------------------------------------------------------------------------- Constructor end
/**
* 将集合中的全部元素对追加到指定键对应的值集合中,效果等同于:
* <pre>{@code

View File

@@ -11,13 +11,13 @@ import java.util.stream.Collectors;
* <p>一个键对应多个值的集合{@link Map}实现,提供针对键对应的值集合中的元素而非值集合本身的一些快捷操作,
* 本身可作为一个值为{@link Collection}类型的{@link Map}使用。<br>
*
* <h3>值集合类型</h3>
* <p>值集合类型</p>
* <p>值集合的类型由接口的实现类自行维护,当通过{@link MultiValueMap}定义的方法进行增删改操作时,
* 实现类应保证通过通过实例方法获得的集合类型都一致。但是若用户直接通过{@link Map}定义的方法进行增删改操作时,
* 实例无法保证通过实例方法获得的集合类型都一致。<br>
* 因此,若无必要则更推荐通过{@link MultiValueMap}定义的方法进行操作。
*
* <h3>对值集合的修改</h3>
* <p>对值集合的修改</p>
* <p>当通过实例方法获得值集合时,若该集合允许修改,则对值集合的修改将会影响到其所属的{@link MultiValueMap}实例,反之亦然。
* 因此当同时遍历当前实例或者值集合时,若存在写操作,则需要注意可能引发的{@link ConcurrentModificationException}。
*
@@ -40,6 +40,7 @@ public interface MultiValueMap<K, V> extends Map<K, Collection<V>> {
* @param value 键对应的新值集合
* @return 旧值集合
*/
@SuppressWarnings("AbstractMethodOverridesAbstractMethod")
@Override
Collection<V> put(K key, Collection<V> value);
@@ -49,6 +50,7 @@ public interface MultiValueMap<K, V> extends Map<K, Collection<V>> {
*
* @param map 需要更新的键值对集合
*/
@SuppressWarnings("AbstractMethodOverridesAbstractMethod")
@Override
void putAll(Map<? extends K, ? extends Collection<V>> map);
@@ -100,6 +102,7 @@ public interface MultiValueMap<K, V> extends Map<K, Collection<V>> {
* @param values 待添加的值
* @return boolean
*/
@SuppressWarnings("unchecked")
default boolean putValues(final K key, final V... values) {
return ArrayUtil.isNotEmpty(values) && putAllValues(key, Arrays.asList(values));
}
@@ -138,6 +141,7 @@ public interface MultiValueMap<K, V> extends Map<K, Collection<V>> {
* @param values 值数组
* @return 是否成功删除
*/
@SuppressWarnings("unchecked")
default boolean removeValues(final K key, final V... values) {
return ArrayUtil.isNotEmpty(values) && removeAllValues(key, Arrays.asList(values));
}
@@ -189,6 +193,18 @@ public interface MultiValueMap<K, V> extends Map<K, Collection<V>> {
// =================== read operate ===================
/**
* 获取指定序号的值,若值不存在,返回{@code null}
*
* @param key 键
* @param index 第几个值的索引越界返回null
* @return 值或null
*/
default V getValue(K key, int index) {
final Collection<V> collection = get(key);
return CollUtil.get(collection, index);
}
/**
* 获取键对应的值,若值不存在,则返回{@link Collections#emptyList()}。效果等同于:
* <pre>{@code

View File

@@ -1,5 +1,24 @@
/**
* 多参数类型的Map实现包括集合类型值的Map和Table
* 多参数类型的Map实现包括集合类型值的MultiValueMap和Table<br>
* <ul>
* <li>MultiValueMap一个键对应多个值的集合的实现类似于树的结构。</li>
* <li>Table使用两个键映射到一个值类似于表格结构。</li>
* </ul>
*
* <pre>
* MultiValueMap
* |
* AbsCollValueMap
* ||
* [CollectionValueMap, SetValueMap, ListValueMap]
* </pre>
* <pre>
* Table
* |
* AbsTable
* ||
* [RowKeyTable]
* </pre>
*
* @author looly
*