diff --git a/CHANGELOG.md b/CHANGELOG.md index 80b6e81d2..0d28553d8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,13 +3,14 @@ ------------------------------------------------------------------------------------------------------------- -# 5.7.4 (2021-07-02) +# 5.7.4 (2021-07-06) ### 🐣新特性 * 【crypto 】 SmUtil.sm4统一返回类型(issue#I3YKD4@Gitee) * 【core 】 修改MapUtil.get传入null返回默认值而非null(issue#I3YKBC@Gitee) * 【core 】 HexUtil增加hexToLong、hexToInt(issue#I3YQEV@Gitee) -* 【core 】 CsvWriter增加writer.write(csvData)的方法重载(pr#353@Gitee) +* 【core 】 CsvWriter增加writer.write(csvData)的方法重载(pr#353@Gitee) +* 【core 】 新增AbsCollValueMap(issue#I3YXF0@Gitee) ### 🐞Bug修复 * 【core 】 修复RadixUtil.decode非static问题(issue#I3YPEH@Gitee) diff --git a/hutool-core/src/main/java/cn/hutool/core/map/multi/AbsCollValueMap.java b/hutool-core/src/main/java/cn/hutool/core/map/multi/AbsCollValueMap.java new file mode 100644 index 000000000..fa44cd3d0 --- /dev/null +++ b/hutool-core/src/main/java/cn/hutool/core/map/multi/AbsCollValueMap.java @@ -0,0 +1,127 @@ +package cn.hutool.core.map.multi; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.map.MapWrapper; + +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +/** + * 值作为集合的Map实现,通过调用putValue可以在相同key时加入多个值,多个值用集合表示 + * + * @param 键类型 + * @param 值类型 + * @param 集合类型 + * @author looly + * @since 5.7.4 + */ +public abstract class AbsCollValueMap> extends MapWrapper { + private static final long serialVersionUID = 1L; + + /** + * 默认集合初始大小 + */ + protected static final int DEFAULT_COLLCTION_INITIAL_CAPACITY = 3; + + // ------------------------------------------------------------------------- Constructor start + + /** + * 构造 + */ + public AbsCollValueMap() { + this(DEFAULT_INITIAL_CAPACITY); + } + + /** + * 构造 + * + * @param initialCapacity 初始大小 + */ + public AbsCollValueMap(int initialCapacity) { + this(initialCapacity, DEFAULT_LOAD_FACTOR); + } + + /** + * 构造 + * + * @param m Map + */ + public AbsCollValueMap(Map m) { + this(DEFAULT_LOAD_FACTOR, m); + } + + /** + * 构造 + * + * @param loadFactor 加载因子 + * @param m Map + */ + public AbsCollValueMap(float loadFactor, Map m) { + this(m.size(), loadFactor); + this.putAll(m); + } + + /** + * 构造 + * + * @param initialCapacity 初始大小 + * @param loadFactor 加载因子 + */ + public AbsCollValueMap(int initialCapacity, float loadFactor) { + super(new HashMap<>(initialCapacity, loadFactor)); + } + // ------------------------------------------------------------------------- Constructor end + + /** + * 放入所有value + * + * @param m valueMap + * @since 5.7.4 + */ + public void putAllValues(Map> m) { + if(null != m){ + m.forEach((key, valueColl) -> { + if(null != valueColl){ + valueColl.forEach((value) -> putValue(key, value)); + } + }); + } + } + + /** + * 放入Value
+ * 如果键对应值列表有值,加入,否则创建一个新列表后加入 + * + * @param key 键 + * @param value 值 + */ + public void putValue(K key, V value) { + C collection = this.get(key); + if (null == collection) { + collection = createCollection(); + this.put(key, collection); + } + collection.add(value); + } + + /** + * 获取值 + * + * @param key 键 + * @param index 第几个值的索引,越界返回null + * @return 值或null + */ + public V get(K key, int index) { + final Collection collection = get(key); + return CollUtil.get(collection, index); + } + + /** + * 创建集合
+ * 此方法用于创建在putValue后追加值所在的集合,子类实现此方法创建不同类型的集合 + * + * @return {@link Collection} + */ + protected abstract C createCollection(); +} diff --git a/hutool-core/src/main/java/cn/hutool/core/map/multi/CollectionValueMap.java b/hutool-core/src/main/java/cn/hutool/core/map/multi/CollectionValueMap.java index 7b69aada4..f16ed225c 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/multi/CollectionValueMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/multi/CollectionValueMap.java @@ -1,29 +1,28 @@ package cn.hutool.core.map.multi; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.map.MapWrapper; +import cn.hutool.core.lang.func.Func0; +import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.Map; /** - * 值作为集合的Map实现,通过调用putValue可以在相同key时加入多个值,多个值用集合表示 - * - * @author looly + * 值作为集合的Map实现,通过调用putValue可以在相同key时加入多个值,多个值用集合表示
+ * 此类可以通过传入函数自定义集合类型的创建规则 * * @param 键类型 * @param 值类型 + * @author looly * @since 4.3.3 */ -public abstract class CollectionValueMap extends MapWrapper> { - +public class CollectionValueMap extends AbsCollValueMap> { private static final long serialVersionUID = 9012989578038102983L; - /** 默认集合初始大小 */ - protected static final int DEFAULT_COLLCTION_INITIAL_CAPACITY = 3; + private final Func0> collectionCreateFunc; // ------------------------------------------------------------------------- Constructor start + /** * 构造 */ @@ -53,57 +52,51 @@ public abstract class CollectionValueMap extends MapWrapper> m) { - this(m.size(), loadFactor); - this.putAll(m); + this(loadFactor, m, ArrayList::new); } /** * 构造 * * @param initialCapacity 初始大小 - * @param loadFactor 加载因子 + * @param loadFactor 加载因子 */ public CollectionValueMap(int initialCapacity, float loadFactor) { + this(initialCapacity, loadFactor, ArrayList::new); + } + + /** + * 构造 + * + * @param loadFactor 加载因子 + * @param m Map + * @param collectionCreateFunc Map中值的集合创建函数 + * @since 5.7.4 + */ + public CollectionValueMap(float loadFactor, Map> m, Func0> collectionCreateFunc) { + this(m.size(), loadFactor, collectionCreateFunc); + this.putAll(m); + } + + /** + * 构造 + * + * @param initialCapacity 初始大小 + * @param loadFactor 加载因子 + * @param collectionCreateFunc Map中值的集合创建函数 + * @since 5.7.4 + */ + public CollectionValueMap(int initialCapacity, float loadFactor, Func0> collectionCreateFunc) { super(new HashMap<>(initialCapacity, loadFactor)); + this.collectionCreateFunc = collectionCreateFunc; } // ------------------------------------------------------------------------- Constructor end - /** - * 放入Value
- * 如果键对应值列表有值,加入,否则创建一个新列表后加入 - * - * @param key 键 - * @param value 值 - */ - public void putValue(K key, V value) { - Collection collection = this.get(key); - if (null == collection) { - collection = createCollection(); - this.put(key, collection); - } - collection.add(value); + @Override + protected Collection createCollection() { + return collectionCreateFunc.callWithRuntimeException(); } - - /** - * 获取值 - * - * @param key 键 - * @param index 第几个值的索引,越界返回null - * @return 值或null - */ - public V get(K key, int index) { - final Collection collection = get(key); - return CollUtil.get(collection, index); - } - - /** - * 创建集合
- * 此方法用于创建在putValue后追加值所在的集合,子类实现此方法创建不同类型的集合 - * - * @return {@link Collection} - */ - protected abstract Collection createCollection(); } diff --git a/hutool-core/src/main/java/cn/hutool/core/map/multi/ListValueMap.java b/hutool-core/src/main/java/cn/hutool/core/map/multi/ListValueMap.java index 0201d1470..32989448c 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/multi/ListValueMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/multi/ListValueMap.java @@ -15,7 +15,7 @@ import java.util.Map; * @param 值类型 * @since 4.3.3 */ -public class ListValueMap extends CollectionValueMap { +public class ListValueMap extends AbsCollValueMap> { private static final long serialVersionUID = 6044017508487827899L; // ------------------------------------------------------------------------- Constructor start @@ -52,7 +52,7 @@ public class ListValueMap extends CollectionValueMap { */ public ListValueMap(float loadFactor, Map> m) { this(m.size(), loadFactor); - this.putAll(m); + this.putAllValues(m); } /** @@ -67,12 +67,7 @@ public class ListValueMap extends CollectionValueMap { // ------------------------------------------------------------------------- Constructor end @Override - public List get(Object key) { - return (List) super.get(key); - } - - @Override - protected Collection createCollection() { + protected List createCollection() { return new ArrayList<>(DEFAULT_COLLCTION_INITIAL_CAPACITY); } } diff --git a/hutool-core/src/main/java/cn/hutool/core/map/multi/SetValueMap.java b/hutool-core/src/main/java/cn/hutool/core/map/multi/SetValueMap.java index 58d492504..a4d44ed26 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/multi/SetValueMap.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/multi/SetValueMap.java @@ -15,7 +15,7 @@ import java.util.Set; * @param 值类型 * @since 4.3.3 */ -public class SetValueMap extends CollectionValueMap { +public class SetValueMap extends AbsCollValueMap> { private static final long serialVersionUID = 6044017508487827899L; // ------------------------------------------------------------------------- Constructor start @@ -52,7 +52,7 @@ public class SetValueMap extends CollectionValueMap { */ public SetValueMap(float loadFactor, Map> m) { this(m.size(), loadFactor); - this.putAll(m); + this.putAllValues(m); } /** @@ -67,12 +67,7 @@ public class SetValueMap extends CollectionValueMap { // ------------------------------------------------------------------------- Constructor end @Override - public Set get(Object key) { - return (Set) super.get(key); - } - - @Override - protected Collection createCollection() { + protected Set createCollection() { return new LinkedHashSet<>(DEFAULT_COLLCTION_INITIAL_CAPACITY); } }