Looly 5 years ago
parent
commit
a4e30936fb

+ 3 - 2
CHANGELOG.md

@@ -14,8 +14,9 @@
 * 【core  】     增加PathUtil和FileNameUtil,分离FileUtil中部分方法
 * 【core  】     改造IndexedComparator,增加InstanceComparator
 * 【extra 】     增加CglibUtil
-* 【extra 】     增加Ipv4Util(pr#161@Gitee)
-* 【extra 】     增加CalendarUtil和DateUtil增加isSameMonth方法(pr#161@Gitee)
+* 【core  】     增加Ipv4Util(pr#161@Gitee)
+* 【core  】     增加CalendarUtil和DateUtil增加isSameMonth方法(pr#161@Gitee)
+* 【core  】     Dict增加of方法(issue#1035@Github)
 
 ### Bug修复#
 * 【poi   】     修复ExcelBase.isXlsx方法判断问题(issue#I1S502@Gitee)

+ 101 - 48
hutool-core/src/main/java/cn/hutool/core/lang/Dict.java

@@ -17,9 +17,8 @@ import java.util.Map;
 
 /**
  * 字典对象,扩充了HashMap中的方法
- * 
- * @author loolly
  *
+ * @author loolly
  */
 public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGetter<String> {
 	private static final long serialVersionUID = 6135423866861206530L;
@@ -27,13 +26,16 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 	static final float DEFAULT_LOAD_FACTOR = 0.75f;
 	static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
 
-	/** 是否大小写不敏感 */
+	/**
+	 * 是否大小写不敏感
+	 */
 	private boolean caseInsensitive;
 
 	// --------------------------------------------------------------- Static method start
+
 	/**
 	 * 创建Dict
-	 * 
+	 *
 	 * @return Dict
 	 */
 	public static Dict create() {
@@ -42,17 +44,67 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 
 	/**
 	 * 将PO对象转为Dict
-	 * 
-	 * @param <T> Bean类型
+	 *
+	 * @param <T>  Bean类型
 	 * @param bean Bean对象
 	 * @return Vo
 	 */
 	public static <T> Dict parse(T bean) {
 		return create().parseBean(bean);
 	}
+
+	/**
+	 * 根据给定的Pair数组创建Dict对象
+	 *
+	 * @param pairs 键值对
+	 * @return Dict
+	 * @since 5.4.1
+	 */
+	@SafeVarargs
+	public static Dict of(Pair<String, Object>... pairs) {
+		final Dict dict = create();
+		for (Pair<String, Object> pair : pairs) {
+			dict.put(pair.getKey(), pair.getValue());
+		}
+		return dict;
+	}
+
+	/**
+	 * 根据给定的键值对数组创建Dict对象,传入参数必须为key,value,key,value...
+	 *
+	 * <p>奇数参数必须为key,key最后会转换为String类型。</p>
+	 * <p>奇数参数必须为value,可以为任意类型。</p>
+	 *
+	 * <pre>
+	   Dict dict = Dict.of(
+	 * 	"RED", "#FF0000",
+	 * 	"GREEN", "#00FF00",
+	 * 	"BLUE", "#0000FF"
+	 * );
+	 * </pre>
+	 *
+	 * @param keysAndValues 键值对列表,必须奇数参数为key,偶数参数为value
+	 * @return Dict
+	 * @since 5.4.1
+	 */
+	public static Dict of(Object... keysAndValues) {
+		final Dict dict = create();
+
+		String key = null;
+		for(int i = 0; i < keysAndValues.length; i++){
+			if(i % 2 == 0){
+				dict.put(key, keysAndValues[i]);
+			} else{
+				key = Convert.toStr(keysAndValues[i]);
+			}
+		}
+
+		return dict;
+	}
 	// --------------------------------------------------------------- Static method end
 
 	// --------------------------------------------------------------- Constructor start
+
 	/**
 	 * 构造
 	 */
@@ -62,7 +114,7 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 
 	/**
 	 * 构造
-	 * 
+	 *
 	 * @param caseInsensitive 是否大小写不敏感
 	 */
 	public Dict(boolean caseInsensitive) {
@@ -71,7 +123,7 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 
 	/**
 	 * 构造
-	 * 
+	 *
 	 * @param initialCapacity 初始容量
 	 */
 	public Dict(int initialCapacity) {
@@ -80,7 +132,7 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 
 	/**
 	 * 构造
-	 * 
+	 *
 	 * @param initialCapacity 初始容量
 	 * @param caseInsensitive 是否大小写不敏感
 	 */
@@ -90,9 +142,9 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 
 	/**
 	 * 构造
-	 * 
+	 *
 	 * @param initialCapacity 初始容量
-	 * @param loadFactor 容量增长因子,0~1,即达到容量的百分之多少时扩容
+	 * @param loadFactor      容量增长因子,0~1,即达到容量的百分之多少时扩容
 	 */
 	public Dict(int initialCapacity, float loadFactor) {
 		this(initialCapacity, loadFactor, false);
@@ -100,9 +152,9 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 
 	/**
 	 * 构造
-	 * 
+	 *
 	 * @param initialCapacity 初始容量
-	 * @param loadFactor 容量增长因子,0~1,即达到容量的百分之多少时扩容
+	 * @param loadFactor      容量增长因子,0~1,即达到容量的百分之多少时扩容
 	 * @param caseInsensitive 是否大小写不敏感
 	 * @since 4.5.16
 	 */
@@ -113,7 +165,7 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 
 	/**
 	 * 构造
-	 * 
+	 *
 	 * @param m Map
 	 */
 	public Dict(Map<String, Object> m) {
@@ -123,8 +175,8 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 
 	/**
 	 * 转换为Bean对象
-	 * 
-	 * @param <T> Bean类型
+	 *
+	 * @param <T>  Bean类型
 	 * @param bean Bean
 	 * @return Bean
 	 */
@@ -134,8 +186,8 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 
 	/**
 	 * 转换为Bean对象
-	 * 
-	 * @param <T> Bean类型
+	 *
+	 * @param <T>  Bean类型
 	 * @param bean Bean
 	 * @return Bean
 	 * @since 3.3.1
@@ -147,9 +199,9 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 
 	/**
 	 * 转换为Bean对象
-	 * 
-	 * @param <T> Bean类型
-	 * @param bean Bean
+	 *
+	 * @param <T>           Bean类型
+	 * @param bean          Bean
 	 * @param isToCamelCase 是否转换为驼峰模式
 	 * @return Bean
 	 */
@@ -160,8 +212,8 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 
 	/**
 	 * 转换为Bean对象,并使用驼峰法模式转换
-	 * 
-	 * @param <T> Bean类型
+	 *
+	 * @param <T>  Bean类型
 	 * @param bean Bean
 	 * @return Bean
 	 */
@@ -172,8 +224,8 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 
 	/**
 	 * 填充Value Object对象
-	 * 
-	 * @param <T> Bean类型
+	 *
+	 * @param <T>   Bean类型
 	 * @param clazz Value Object(或者POJO)的类
 	 * @return vo
 	 */
@@ -183,8 +235,8 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 
 	/**
 	 * 填充Value Object对象,忽略大小写
-	 * 
-	 * @param <T> Bean类型
+	 *
+	 * @param <T>   Bean类型
 	 * @param clazz Value Object(或者POJO)的类
 	 * @return vo
 	 */
@@ -195,8 +247,8 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 	/**
 	 * 将值对象转换为Dict<br>
 	 * 类名会被当作表名,小写第一个字母
-	 * 
-	 * @param <T> Bean类型
+	 *
+	 * @param <T>  Bean类型
 	 * @param bean 值对象
 	 * @return 自己
 	 */
@@ -209,11 +261,11 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 	/**
 	 * 将值对象转换为Dict<br>
 	 * 类名会被当作表名,小写第一个字母
-	 * 
-	 * @param <T> Bean类型
-	 * @param bean 值对象
+	 *
+	 * @param <T>               Bean类型
+	 * @param bean              值对象
 	 * @param isToUnderlineCase 是否转换为下划线模式
-	 * @param ignoreNullValue 是否忽略值为空的字段
+	 * @param ignoreNullValue   是否忽略值为空的字段
 	 * @return 自己
 	 */
 	public <T> Dict parseBean(T bean, boolean isToUnderlineCase, boolean ignoreNullValue) {
@@ -225,9 +277,9 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 	/**
 	 * 与给定实体对比并去除相同的部分<br>
 	 * 此方法用于在更新操作时避免所有字段被更新,跳过不需要更新的字段 version from 2.0.0
-	 * 
-	 * @param <T> 字典对象类型
-	 * @param dict 字典对象
+	 *
+	 * @param <T>          字典对象类型
+	 * @param dict         字典对象
 	 * @param withoutNames 不需要去除的字段名
 	 */
 	public <T extends Dict> void removeEqual(T dict, String... withoutNames) {
@@ -246,7 +298,7 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 
 	/**
 	 * 过滤Map保留指定键值对,如果键不存在跳过
-	 * 
+	 *
 	 * @param keys 键列表
 	 * @return Dict 结果
 	 * @since 4.0.10
@@ -263,10 +315,11 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 	}
 
 	// -------------------------------------------------------------------- Set start
+
 	/**
 	 * 设置列
-	 * 
-	 * @param attr 属性
+	 *
+	 * @param attr  属性
 	 * @param value 值
 	 * @return 本身
 	 */
@@ -277,8 +330,8 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 
 	/**
 	 * 设置列,当键或值为null时忽略
-	 * 
-	 * @param attr 属性
+	 *
+	 * @param attr  属性
 	 * @param value 值
 	 * @return 本身
 	 */
@@ -299,8 +352,8 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 
 	/**
 	 * 获得特定类型值
-	 * 
-	 * @param <T> 值类型
+	 *
+	 * @param <T>  值类型
 	 * @param attr 字段名
 	 * @return 字段值
 	 * @since 4.6.3
@@ -311,9 +364,9 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 
 	/**
 	 * 获得特定类型值
-	 * 
-	 * @param <T> 值类型
-	 * @param attr 字段名
+	 *
+	 * @param <T>          值类型
+	 * @param attr         字段名
 	 * @param defaultValue 默认值
 	 * @return 字段值
 	 */
@@ -455,7 +508,7 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 
 	@Override
 	public Object get(Object key) {
-		return super.get(customKey((String)key));
+		return super.get(customKey((String) key));
 	}
 
 	@Override
@@ -475,7 +528,7 @@ public class Dict extends LinkedHashMap<String, Object> implements BasicTypeGett
 
 	/**
 	 * 将Key转为小写
-	 * 
+	 *
 	 * @param key KEY
 	 * @return 小写KEY
 	 */

+ 8 - 4
hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java

@@ -289,7 +289,11 @@ public class MapUtil {
 	 * </pre>
 	 *
 	 * <pre>
-	 * Map&lt;Object, Object&gt; colorMap = MapUtil.of(new String[][] { { "RED", "#FF0000" }, { "GREEN", "#00FF00" }, { "BLUE", "#0000FF" } });
+	 * Map&lt;Object, Object&gt; colorMap = MapUtil.of(new String[][] {
+	 * 	{ "RED", "#FF0000" },
+	 * 	{ "GREEN", "#00FF00" },
+	 * 	{ "BLUE", "#0000FF" }
+	 * });
 	 * </pre>
 	 * <p>
 	 * 参考:commons-lang
@@ -305,7 +309,7 @@ public class MapUtil {
 		}
 		final HashMap<Object, Object> map = new HashMap<>((int) (array.length * 1.5));
 		for (int i = 0; i < array.length; i++) {
-			Object object = array[i];
+			final Object object = array[i];
 			if (object instanceof Map.Entry) {
 				Map.Entry entry = (Map.Entry) object;
 				map.put(entry.getKey(), entry.getValue());
@@ -315,7 +319,7 @@ public class MapUtil {
 					map.put(entry[0], entry[1]);
 				}
 			} else if (object instanceof Iterable) {
-				Iterator iter = ((Iterable) object).iterator();
+				final Iterator iter = ((Iterable) object).iterator();
 				if (iter.hasNext()) {
 					final Object key = iter.next();
 					if (iter.hasNext()) {
@@ -324,7 +328,7 @@ public class MapUtil {
 					}
 				}
 			} else if (object instanceof Iterator) {
-				Iterator iter = ((Iterator) object);
+				final Iterator iter = ((Iterator) object);
 				if (iter.hasNext()) {
 					final Object key = iter.next();
 					if (iter.hasNext()) {