From 2f2c9e58d2aeb773efe007cc8673f4384ef69fca Mon Sep 17 00:00:00 2001 From: Looly Date: Wed, 21 Aug 2019 16:12:06 +0800 Subject: [PATCH] add emptyIfNull --- CHANGELOG.md | 1 + .../cn/hutool/core/collection/CollUtil.java | 64 +++++++++++----- .../java/cn/hutool/core/date/DateTime.java | 11 +++ .../main/java/cn/hutool/core/map/MapUtil.java | 74 +++++++++++-------- .../java/cn/hutool/json/JSONUtilTest.java | 8 +- 5 files changed, 103 insertions(+), 55 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d8c18376b..31e0d3c41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ ### 新特性 * 【core】 改进CollUtil.zip逻辑,减少内存复制(issue#I10T01@Gitee) * 【extra】 邮件增加图片支持(pr#495@Github) +* 【core】 MapUtil、CollUtil增加emptyIfNull(issue#502@Github) ### Bug修复 * 【http】 修复HttpRquest中body方法长度计算问题(issue#I10UPG@Gitee) diff --git a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java index e14099797..429a7d266 100644 --- a/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/collection/CollUtil.java @@ -60,6 +60,32 @@ import cn.hutool.core.util.TypeUtil; */ public class CollUtil { + /** + * 如果提供的集合为{@code null},返回一个不可变的默认空集合,否则返回原集合
+ * 空集合使用{@link Collections#emptySet()} + * + * @param 集合元素类型 + * @param set 提供的集合,可能为null + * @return 原集合,若为null返回空集合 + * @since 4.6.3 + */ + public static Set emptyIfNull(Set set) { + return (null == set) ? Collections.emptySet() : set; + } + + /** + * 如果提供的集合为{@code null},返回一个不可变的默认空集合,否则返回原集合
+ * 空集合使用{@link Collections#emptyList()} + * + * @param 集合元素类型 + * @param set 提供的集合,可能为null + * @return 原集合,若为null返回空集合 + * @since 4.6.3 + */ + public static List emptyIfNull(List set) { + return (null == set) ? Collections.emptyList() : set; + } + /** * 两个集合的并集
* 针对一个集合中存在多个相同元素的情况,计算两个集合中此元素的个数,保留最多的个数
@@ -245,7 +271,7 @@ public class CollUtil { } return false; } - + /** * 集合1中是否包含集合2中所有的元素,既集合2是否为集合1的子集 * @@ -258,7 +284,7 @@ public class CollUtil { if (isEmpty(coll1) || isEmpty(coll2) || coll1.size() < coll2.size()) { return false; } - + for (Object object : coll2) { if (false == coll1.contains(object)) { return false; @@ -851,9 +877,9 @@ public class CollUtil { if (list == null) { return null; } - - if(list.isEmpty()) { - return new ArrayList<>(0); + + if (list.isEmpty()) { + return new ArrayList<>(0); } final int size = list.size(); @@ -1161,10 +1187,10 @@ public class CollUtil { */ public static List extract(Iterable collection, Editor editor, boolean ignoreNull) { final List fieldValueList = new ArrayList<>(); - if(null == collection) { + if (null == collection) { return fieldValueList; } - + Object value; for (Object bean : collection) { value = editor.edit(bean); @@ -1519,7 +1545,7 @@ public class CollUtil { int entryCount = Math.min(keys.size(), values.size()); final Map map = newHashMap(entryCount); - + final Iterator keyIterator = keys.iterator(); final Iterator valueIterator = values.iterator(); while (entryCount > 0) { @@ -1863,14 +1889,14 @@ public class CollUtil { } final int size = collection.size(); - if(0 == size) { + if (0 == size) { return null; } - + if (index < 0) { index += size; } - + // 检查越界 if (index >= size) { return null; @@ -2419,7 +2445,7 @@ public class CollUtil { } return list; } - + /** * 获取指定Map列表中所有的Key * @@ -2428,18 +2454,18 @@ public class CollUtil { * @return key集合 * @since 4.5.12 */ - public static Set keySet(Collection> mapCollection){ - if(isEmpty(mapCollection)) { + public static Set keySet(Collection> mapCollection) { + if (isEmpty(mapCollection)) { return new HashSet<>(); } final HashSet set = new HashSet<>(mapCollection.size() * 16); - for (Map map : mapCollection) { + for (Map map : mapCollection) { set.addAll(map.keySet()); } - + return set; } - + /** * 获取指定Map列表中所有的Value * @@ -2448,12 +2474,12 @@ public class CollUtil { * @return Value集合 * @since 4.5.12 */ - public static List values(Collection> mapCollection){ + public static List values(Collection> mapCollection) { final List values = new ArrayList<>(); for (Map map : mapCollection) { values.addAll(map.values()); } - + return values; } diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java b/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java index 65292e372..7d8701326 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java @@ -30,6 +30,17 @@ public class DateTime extends Date { private Week firstDayOfWeek = Week.MONDAY; /** 时区 */ private TimeZone timeZone; + + /** + * 转换时间戳为 DateTime + * + * @param timeMillis 时间戳,毫秒数 + * @return DateTime + * @since 4.6.3 + */ + public static DateTime of(long timeMillis) { + return new DateTime(timeMillis); + } /** * 转换JDK date为 DateTime diff --git a/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java b/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java index 9a66d9dad..4bd3f590a 100644 --- a/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/map/MapUtil.java @@ -2,6 +2,7 @@ package cn.hutool.core.map; import java.util.AbstractMap; import java.util.ArrayList; +import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; @@ -57,6 +58,19 @@ public class MapUtil { return null != map && false == map.isEmpty(); } + /** + * 如果提供的集合为{@code null},返回一个不可变的默认空集合,否则返回原集合
+ * 空集合使用{@link Collections#emptyMap()} + * + * @param 集合元素类型 + * @param set 提供的集合,可能为null + * @return 原集合,若为null返回空集合 + * @since 4.6.3 + */ + public static Map emptyIfNull(Map set) { + return (null == set) ? Collections.emptyMap() : set; + } + // ----------------------------------------------------------------------------------------------- new HashMap /** * 新建一个HashMap @@ -134,14 +148,14 @@ public class MapUtil { } return treeMap; } - + /** * 创建键不重复Map * * @return {@link IdentityHashMap} * @since 4.5.7 */ - public static Map newIdentityMap(int size){ + public static Map newIdentityMap(int size) { return new IdentityHashMap<>(size); } @@ -204,11 +218,7 @@ public class MapUtil { * * *
-	 * Map<Object, Object> colorMap = MapUtil.of(new String[][] {
-	 *     {"RED", "#FF0000"},
-	 *     {"GREEN", "#00FF00"},
-	 *     {"BLUE", "#0000FF"}
-	 * });
+	 * Map<Object, Object> colorMap = MapUtil.of(new String[][] { { "RED", "#FF0000" }, { "GREEN", "#00FF00" }, { "BLUE", "#0000FF" } });
 	 * 
* * 参考:commons-lang @@ -388,7 +398,7 @@ public class MapUtil { public static Map toCamelCaseMap(Map map) { return (map instanceof LinkedHashMap) ? new CamelCaseLinkedMap<>(map) : new CamelCaseMap<>(map); } - + /** * 将键值对转换为二维数组,第一维是key,第二纬是value * @@ -397,15 +407,15 @@ public class MapUtil { * @since 4.1.9 */ public static Object[][] toObjectArray(Map map) { - if(map == null) { + if (map == null) { return null; } final Object[][] result = new Object[map.size()][2]; - if(map.isEmpty()) { + if (map.isEmpty()) { return result; } int index = 0; - for(Entry entry : map.entrySet()) { + for (Entry entry : map.entrySet()) { result[index][0] = entry.getKey(); result[index][1] = entry.getValue(); index++; @@ -489,10 +499,10 @@ public class MapUtil { * @return 过滤后的Map */ public static Map filter(Map map, Editor> editor) { - if(null == map || null == editor) { + if (null == map || null == editor) { return map; } - + final Map map2 = ObjectUtil.clone(map); if (isEmpty(map2)) { return map2; @@ -525,10 +535,10 @@ public class MapUtil { * @since 3.1.0 */ public static Map filter(Map map, Filter> filter) { - if(null == map || null == filter) { + if (null == map || null == filter) { return map; } - + final Map map2 = ObjectUtil.clone(map); if (isEmpty(map2)) { return map2; @@ -542,7 +552,7 @@ public class MapUtil { } return map2; } - + /** * 过滤Map保留指定键值对,如果键不存在跳过 * @@ -562,7 +572,7 @@ public class MapUtil { map2.clear(); for (K key : keys) { - if(map.containsKey(key)) { + if (map.containsKey(key)) { map2.put(key, map.get(key)); } } @@ -675,7 +685,7 @@ public class MapUtil { public static MapProxy createProxy(Map map) { return MapProxy.create(map); } - + /** * 创建Map包装类MapWrapper
* {@link MapWrapper}对Map做一次包装 @@ -745,7 +755,7 @@ public class MapUtil { } }); } - + /** * 获取Map指定key的值,并转换为字符串 * @@ -757,7 +767,7 @@ public class MapUtil { public static String getStr(Map map, Object key) { return get(map, key, String.class); } - + /** * 获取Map指定key的值,并转换为Integer * @@ -769,7 +779,7 @@ public class MapUtil { public static Integer getInt(Map map, Object key) { return get(map, key, Integer.class); } - + /** * 获取Map指定key的值,并转换为Double * @@ -781,7 +791,7 @@ public class MapUtil { public static Double getDouble(Map map, Object key) { return get(map, key, Double.class); } - + /** * 获取Map指定key的值,并转换为Float * @@ -793,7 +803,7 @@ public class MapUtil { public static Float getFloat(Map map, Object key) { return get(map, key, Float.class); } - + /** * 获取Map指定key的值,并转换为Short * @@ -805,7 +815,7 @@ public class MapUtil { public static Short getShort(Map map, Object key) { return get(map, key, Short.class); } - + /** * 获取Map指定key的值,并转换为Bool * @@ -817,7 +827,7 @@ public class MapUtil { public static Boolean getBool(Map map, Object key) { return get(map, key, Boolean.class); } - + /** * 获取Map指定key的值,并转换为Character * @@ -829,7 +839,7 @@ public class MapUtil { public static Character getChar(Map map, Object key) { return get(map, key, Character.class); } - + /** * 获取Map指定key的值,并转换为Long * @@ -841,7 +851,7 @@ public class MapUtil { public static Long getLong(Map map, Object key) { return get(map, key, Long.class); } - + /** * 获取Map指定key的值,并转换为{@link Date} * @@ -853,7 +863,7 @@ public class MapUtil { public static Date getDate(Map map, Object key) { return get(map, key, Date.class); } - + /** * 获取Map指定key的值,并转换为指定类型 * @@ -867,7 +877,7 @@ public class MapUtil { public static T get(Map map, Object key, Class type) { return null == map ? null : Convert.convert(type, map.get(key)); } - + /** * 获取Map指定key的值,并转换为指定类型 * @@ -881,7 +891,7 @@ public class MapUtil { public static T get(Map map, Object key, TypeReference type) { return null == map ? null : Convert.convert(type, map.get(key)); } - + /** * 重命名键
* 实现方式为一处然后重新put,当旧的key不存在直接返回
@@ -895,8 +905,8 @@ public class MapUtil { * @since 4.5.16 */ public static Map renameKey(Map map, K oldKey, K newKey) { - if(isNotEmpty(map) && map.containsKey(oldKey)) { - if(map.containsKey(newKey)) { + if (isNotEmpty(map) && map.containsKey(oldKey)) { + if (map.containsKey(newKey)) { throw new IllegalArgumentException(StrUtil.format("The key '{}' exist !", newKey)); } map.put(newKey, map.remove(oldKey)); diff --git a/hutool-json/src/test/java/cn/hutool/json/JSONUtilTest.java b/hutool-json/src/test/java/cn/hutool/json/JSONUtilTest.java index fc76a31c3..8d44d0a84 100644 --- a/hutool-json/src/test/java/cn/hutool/json/JSONUtilTest.java +++ b/hutool-json/src/test/java/cn/hutool/json/JSONUtilTest.java @@ -15,7 +15,7 @@ import cn.hutool.json.test.bean.UserA; import cn.hutool.json.test.bean.UserC; public class JSONUtilTest { - + @Test public void toJsonStrTest() { UserA a1 = new UserA(); @@ -47,7 +47,7 @@ public class JSONUtilTest { data.put("model2", model); JSONObject jsonObject = JSONUtil.parseObj(data); - + Assert.assertTrue(jsonObject.containsKey("model")); Assert.assertEquals(1, jsonObject.getJSONObject("model").getInt("type").intValue()); Assert.assertEquals("17610836523", jsonObject.getJSONObject("model").getStr("mobile")); @@ -94,7 +94,7 @@ public class JSONUtilTest { JSONObject propJson = JSONUtil.parseObj(prop); Assert.assertEquals("男", propJson.getStr("gender")); Assert.assertEquals(18, propJson.getInt("age").intValue()); -// Assert.assertEquals("{\"age\":18,\"gender\":\"男\"}", user.getProp()); + // Assert.assertEquals("{\"age\":18,\"gender\":\"男\"}", user.getProp()); } @Test @@ -117,7 +117,7 @@ public class JSONUtilTest { JSONObject jsonObject = JSONUtil.parseObj(html); Assert.assertEquals("Something\\u00a0must\\u00a0have\\u00a0been\\u00a0changed\\u00a0since\\u00a0you\\u00a0leave", jsonObject.getStrEscaped("name")); } - + @Test public void parseFromXmlTest() { String s = "640102197312070614640102197312070614Xaa1";