mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
add AbsCollMap
This commit is contained in:
parent
862756e48f
commit
38589c064b
@ -3,13 +3,14 @@
|
|||||||
|
|
||||||
-------------------------------------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
# 5.7.4 (2021-07-02)
|
# 5.7.4 (2021-07-06)
|
||||||
|
|
||||||
### 🐣新特性
|
### 🐣新特性
|
||||||
* 【crypto 】 SmUtil.sm4统一返回类型(issue#I3YKD4@Gitee)
|
* 【crypto 】 SmUtil.sm4统一返回类型(issue#I3YKD4@Gitee)
|
||||||
* 【core 】 修改MapUtil.get传入null返回默认值而非null(issue#I3YKBC@Gitee)
|
* 【core 】 修改MapUtil.get传入null返回默认值而非null(issue#I3YKBC@Gitee)
|
||||||
* 【core 】 HexUtil增加hexToLong、hexToInt(issue#I3YQEV@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修复
|
### 🐞Bug修复
|
||||||
* 【core 】 修复RadixUtil.decode非static问题(issue#I3YPEH@Gitee)
|
* 【core 】 修复RadixUtil.decode非static问题(issue#I3YPEH@Gitee)
|
||||||
|
@ -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 <K> 键类型
|
||||||
|
* @param <V> 值类型
|
||||||
|
* @param <C> 集合类型
|
||||||
|
* @author looly
|
||||||
|
* @since 5.7.4
|
||||||
|
*/
|
||||||
|
public abstract class AbsCollValueMap<K, V, C extends Collection<V>> extends MapWrapper<K, C> {
|
||||||
|
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<? extends K, C> m) {
|
||||||
|
this(DEFAULT_LOAD_FACTOR, m);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造
|
||||||
|
*
|
||||||
|
* @param loadFactor 加载因子
|
||||||
|
* @param m Map
|
||||||
|
*/
|
||||||
|
public AbsCollValueMap(float loadFactor, Map<? extends K, C> 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<? extends K, ? extends Collection<V>> m) {
|
||||||
|
if(null != m){
|
||||||
|
m.forEach((key, valueColl) -> {
|
||||||
|
if(null != valueColl){
|
||||||
|
valueColl.forEach((value) -> putValue(key, value));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 放入Value<br>
|
||||||
|
* 如果键对应值列表有值,加入,否则创建一个新列表后加入
|
||||||
|
*
|
||||||
|
* @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<V> collection = get(key);
|
||||||
|
return CollUtil.get(collection, index);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建集合<br>
|
||||||
|
* 此方法用于创建在putValue后追加值所在的集合,子类实现此方法创建不同类型的集合
|
||||||
|
*
|
||||||
|
* @return {@link Collection}
|
||||||
|
*/
|
||||||
|
protected abstract C createCollection();
|
||||||
|
}
|
@ -1,29 +1,28 @@
|
|||||||
package cn.hutool.core.map.multi;
|
package cn.hutool.core.map.multi;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.lang.func.Func0;
|
||||||
import cn.hutool.core.map.MapWrapper;
|
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 值作为集合的Map实现,通过调用putValue可以在相同key时加入多个值,多个值用集合表示
|
* 值作为集合的Map实现,通过调用putValue可以在相同key时加入多个值,多个值用集合表示<br>
|
||||||
*
|
* 此类可以通过传入函数自定义集合类型的创建规则
|
||||||
* @author looly
|
|
||||||
*
|
*
|
||||||
* @param <K> 键类型
|
* @param <K> 键类型
|
||||||
* @param <V> 值类型
|
* @param <V> 值类型
|
||||||
|
* @author looly
|
||||||
* @since 4.3.3
|
* @since 4.3.3
|
||||||
*/
|
*/
|
||||||
public abstract class CollectionValueMap<K, V> extends MapWrapper<K, Collection<V>> {
|
public class CollectionValueMap<K, V> extends AbsCollValueMap<K, V, Collection<V>> {
|
||||||
|
|
||||||
private static final long serialVersionUID = 9012989578038102983L;
|
private static final long serialVersionUID = 9012989578038102983L;
|
||||||
|
|
||||||
/** 默认集合初始大小 */
|
private final Func0<Collection<V>> collectionCreateFunc;
|
||||||
protected static final int DEFAULT_COLLCTION_INITIAL_CAPACITY = 3;
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------- Constructor start
|
// ------------------------------------------------------------------------- Constructor start
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构造
|
* 构造
|
||||||
*/
|
*/
|
||||||
@ -56,8 +55,7 @@ public abstract class CollectionValueMap<K, V> extends MapWrapper<K, Collection<
|
|||||||
* @param m Map
|
* @param m Map
|
||||||
*/
|
*/
|
||||||
public CollectionValueMap(float loadFactor, Map<? extends K, ? extends Collection<V>> m) {
|
public CollectionValueMap(float loadFactor, Map<? extends K, ? extends Collection<V>> m) {
|
||||||
this(m.size(), loadFactor);
|
this(loadFactor, m, ArrayList::new);
|
||||||
this.putAll(m);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -67,43 +65,38 @@ public abstract class CollectionValueMap<K, V> extends MapWrapper<K, Collection<
|
|||||||
* @param loadFactor 加载因子
|
* @param loadFactor 加载因子
|
||||||
*/
|
*/
|
||||||
public CollectionValueMap(int initialCapacity, float 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<? extends K, ? extends Collection<V>> m, Func0<Collection<V>> 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<Collection<V>> collectionCreateFunc) {
|
||||||
super(new HashMap<>(initialCapacity, loadFactor));
|
super(new HashMap<>(initialCapacity, loadFactor));
|
||||||
|
this.collectionCreateFunc = collectionCreateFunc;
|
||||||
}
|
}
|
||||||
// ------------------------------------------------------------------------- Constructor end
|
// ------------------------------------------------------------------------- Constructor end
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* 放入Value<br>
|
protected Collection<V> createCollection() {
|
||||||
* 如果键对应值列表有值,加入,否则创建一个新列表后加入
|
return collectionCreateFunc.callWithRuntimeException();
|
||||||
*
|
|
||||||
* @param key 键
|
|
||||||
* @param value 值
|
|
||||||
*/
|
|
||||||
public void putValue(K key, V value) {
|
|
||||||
Collection<V> 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<V> collection = get(key);
|
|
||||||
return CollUtil.get(collection, index);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 创建集合<br>
|
|
||||||
* 此方法用于创建在putValue后追加值所在的集合,子类实现此方法创建不同类型的集合
|
|
||||||
*
|
|
||||||
* @return {@link Collection}
|
|
||||||
*/
|
|
||||||
protected abstract Collection<V> createCollection();
|
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@ import java.util.Map;
|
|||||||
* @param <V> 值类型
|
* @param <V> 值类型
|
||||||
* @since 4.3.3
|
* @since 4.3.3
|
||||||
*/
|
*/
|
||||||
public class ListValueMap<K, V> extends CollectionValueMap<K, V> {
|
public class ListValueMap<K, V> extends AbsCollValueMap<K, V, List<V>> {
|
||||||
private static final long serialVersionUID = 6044017508487827899L;
|
private static final long serialVersionUID = 6044017508487827899L;
|
||||||
|
|
||||||
// ------------------------------------------------------------------------- Constructor start
|
// ------------------------------------------------------------------------- Constructor start
|
||||||
@ -52,7 +52,7 @@ public class ListValueMap<K, V> extends CollectionValueMap<K, V> {
|
|||||||
*/
|
*/
|
||||||
public ListValueMap(float loadFactor, Map<? extends K, ? extends Collection<V>> m) {
|
public ListValueMap(float loadFactor, Map<? extends K, ? extends Collection<V>> m) {
|
||||||
this(m.size(), loadFactor);
|
this(m.size(), loadFactor);
|
||||||
this.putAll(m);
|
this.putAllValues(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -67,12 +67,7 @@ public class ListValueMap<K, V> extends CollectionValueMap<K, V> {
|
|||||||
// ------------------------------------------------------------------------- Constructor end
|
// ------------------------------------------------------------------------- Constructor end
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<V> get(Object key) {
|
protected List<V> createCollection() {
|
||||||
return (List<V>) super.get(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Collection<V> createCollection() {
|
|
||||||
return new ArrayList<>(DEFAULT_COLLCTION_INITIAL_CAPACITY);
|
return new ArrayList<>(DEFAULT_COLLCTION_INITIAL_CAPACITY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@ import java.util.Set;
|
|||||||
* @param <V> 值类型
|
* @param <V> 值类型
|
||||||
* @since 4.3.3
|
* @since 4.3.3
|
||||||
*/
|
*/
|
||||||
public class SetValueMap<K, V> extends CollectionValueMap<K, V> {
|
public class SetValueMap<K, V> extends AbsCollValueMap<K, V, Set<V>> {
|
||||||
private static final long serialVersionUID = 6044017508487827899L;
|
private static final long serialVersionUID = 6044017508487827899L;
|
||||||
|
|
||||||
// ------------------------------------------------------------------------- Constructor start
|
// ------------------------------------------------------------------------- Constructor start
|
||||||
@ -52,7 +52,7 @@ public class SetValueMap<K, V> extends CollectionValueMap<K, V> {
|
|||||||
*/
|
*/
|
||||||
public SetValueMap(float loadFactor, Map<? extends K, ? extends Collection<V>> m) {
|
public SetValueMap(float loadFactor, Map<? extends K, ? extends Collection<V>> m) {
|
||||||
this(m.size(), loadFactor);
|
this(m.size(), loadFactor);
|
||||||
this.putAll(m);
|
this.putAllValues(m);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -67,12 +67,7 @@ public class SetValueMap<K, V> extends CollectionValueMap<K, V> {
|
|||||||
// ------------------------------------------------------------------------- Constructor end
|
// ------------------------------------------------------------------------- Constructor end
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Set<V> get(Object key) {
|
protected Set<V> createCollection() {
|
||||||
return (Set<V>) super.get(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected Collection<V> createCollection() {
|
|
||||||
return new LinkedHashSet<>(DEFAULT_COLLCTION_INITIAL_CAPACITY);
|
return new LinkedHashSet<>(DEFAULT_COLLCTION_INITIAL_CAPACITY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user