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

View File

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

View File

@ -25,7 +25,6 @@ import java.net.HttpCookie;
import java.net.URI; import java.net.URI;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import java.util.Map; import java.util.Map;
/** /**
@ -303,7 +302,7 @@ public class HttpServerRequest extends HttpServerBase {
* @since 5.5.8 * @since 5.5.8
*/ */
public String getParam(final String name){ public String getParam(final String name){
return getParams().get(name, 0); return getParams().getValue(name, 0);
} }
/** /**
@ -313,7 +312,7 @@ public class HttpServerRequest extends HttpServerBase {
* @return 参数值 * @return 参数值
* @since 5.5.8 * @since 5.5.8
*/ */
public List<String> getParams(final String name){ public Collection<String> getParams(final String name){
return getParams().get(name); return getParams().get(name);
} }