Looly 5 年 前
コミット
0321ce1120

+ 1 - 0
CHANGELOG.md

@@ -18,6 +18,7 @@
 
 ### Bug修复
 * 【core   】     修复URLBuilder中请求参数有`&`导致的问题(issue#850@Github)
+* 【core   】     修复URLBuilder中路径以`/`结尾导致的问题(issue#I1G44J@Gitee)
 * 【db     】     修复SqlBuilder中orderBy无效问题(issue#856@Github)
 
 -------------------------------------------------------------------------------------------------------------

+ 91 - 8
hutool-core/src/main/java/cn/hutool/core/map/MapWrapper.java

@@ -4,42 +4,50 @@ import java.io.Serializable;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
+import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
+import java.util.function.Function;
 
 /**
  * Map包装类,通过包装一个已有Map实现特定功能。例如自定义Key的规则或Value规则
- * 
- * @author looly
  *
  * @param <K> 键类型
  * @param <V> 值类型
  * @author looly
+ * @author looly
  * @since 4.3.3
  */
 public class MapWrapper<K, V> implements Map<K, V>, Iterable<Map.Entry<K, V>>, Serializable, Cloneable {
 	private static final long serialVersionUID = -7524578042008586382L;
-	
-	/** 默认增长因子 */
+
+	/**
+	 * 默认增长因子
+	 */
 	protected static final float DEFAULT_LOAD_FACTOR = 0.75f;
-	/** 默认初始大小 */
+	/**
+	 * 默认初始大小
+	 */
 	protected static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16
 
 	private final Map<K, V> raw;
 
 	/**
 	 * 构造
-	 * 
+	 *
 	 * @param raw 被包装的Map
 	 */
 	public MapWrapper(Map<K, V> raw) {
 		this.raw = raw;
 	}
-	
+
 	/**
 	 * 获取原始的Map
+	 *
 	 * @return Map
 	 */
-	public Map<K, V> getRaw(){
+	public Map<K, V> getRaw() {
 		return this.raw;
 	}
 
@@ -114,7 +122,82 @@ public class MapWrapper<K, V> implements Map<K, V>, Iterable<Map.Entry<K, V>>, S
 	}
 
 	@Override
+	public boolean equals(Object o) {
+		if (this == o) {
+			return true;
+		}
+		if (o == null || getClass() != o.getClass()) {
+			return false;
+		}
+		MapWrapper<?, ?> that = (MapWrapper<?, ?>) o;
+		return Objects.equals(raw, that.raw);
+	}
+
+	@Override
+	public int hashCode() {
+		return Objects.hash(raw);
+	}
+
+	@Override
 	public String toString() {
 		return raw.toString();
 	}
+
+
+	@Override
+	public void forEach(BiConsumer<? super K, ? super V> action) {
+		raw.forEach(action);
+	}
+
+	@Override
+	public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
+		raw.replaceAll(function);
+	}
+
+	@Override
+	public V putIfAbsent(K key, V value) {
+		return raw.putIfAbsent(key, value);
+	}
+
+	@Override
+	public boolean remove(Object key, Object value) {
+		return raw.remove(key, value);
+	}
+
+	@Override
+	public boolean replace(K key, V oldValue, V newValue) {
+		return raw.replace(key, oldValue, newValue);
+	}
+
+	@Override
+	public V replace(K key, V value) {
+		return raw.replace(key, value);
+	}
+
+	@Override
+	public V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {
+		return raw.computeIfAbsent(key, mappingFunction);
+	}
+
+	//---------------------------------------------------------------------------- Override default methods start
+	@Override
+	public V getOrDefault(Object key, V defaultValue) {
+		return raw.getOrDefault(key, defaultValue);
+	}
+
+	@Override
+	public V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
+		return raw.computeIfPresent(key, remappingFunction);
+	}
+
+	@Override
+	public V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
+		return raw.compute(key, remappingFunction);
+	}
+
+	@Override
+	public V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
+		return raw.merge(key, value, remappingFunction);
+	}
+	//---------------------------------------------------------------------------- Override default methods end
 }

+ 5 - 4
hutool-core/src/main/java/cn/hutool/core/map/TolerantMap.java

@@ -14,7 +14,7 @@ import java.util.Objects;
 public class TolerantMap<K, V> extends MapWrapper<K, V> {
 	private static final long serialVersionUID = -4158133823263496197L;
 
-	private final transient V defaultValue;
+	private final V defaultValue;
 
 	/**
 	 * 构造
@@ -83,11 +83,12 @@ public class TolerantMap<K, V> extends MapWrapper<K, V> {
 		if (o == null || getClass() != o.getClass()) {
 			return false;
 		}
-		if (!super.equals(o)) {
+		if (false == super.equals(o)) {
 			return false;
 		}
-		TolerantMap<?, ?> that = (TolerantMap<?, ?>) o;
-		return getRaw().equals(that.getRaw()) && Objects.equals(defaultValue, that.defaultValue);
+		final TolerantMap<?, ?> that = (TolerantMap<?, ?>) o;
+		return getRaw().equals(that.getRaw())
+				&& Objects.equals(defaultValue, that.defaultValue);
 	}
 
 	@Override

+ 28 - 28
hutool-core/src/test/java/cn/hutool/core/map/TolerantMapTest.java

@@ -9,32 +9,32 @@ import java.util.HashMap;
 
 public class TolerantMapTest {
 
-    private final TolerantMap<String, String> map = TolerantMap.of(new HashMap<>(), "default");
-
-    @Before
-    public void before() {
-        map.put("monday", "星期一");
-        map.put("tuesday", "星期二");
-    }
-
-    @Test
-    public void testSerialize() {
-        byte[] bytes = ObjectUtil.serialize(map);
-        TolerantMap<String, String> serializedMap = ObjectUtil.deserialize(bytes);
-        assert serializedMap != map;
-        assert map.equals(serializedMap);
-    }
-
-    @Test
-    public void testClone() {
-        TolerantMap<String, String> clonedMap = ObjectUtil.clone(map);
-        assert clonedMap != map;
-        assert map.equals(clonedMap);
-    }
-
-    @Test
-    public void testGet() {
-        assert "星期二".equals(map.get("tuesday"));
-        assert "default".equals(map.get(RandomUtil.randomString(6)));
-    }
+	private final TolerantMap<String, String> map = TolerantMap.of(new HashMap<>(), "default");
+
+	@Before
+	public void before() {
+		map.put("monday", "星期一");
+		map.put("tuesday", "星期二");
+	}
+
+	@Test
+	public void testSerialize() {
+		byte[] bytes = ObjectUtil.serialize(map);
+		TolerantMap<String, String> serializedMap = ObjectUtil.deserialize(bytes);
+		assert serializedMap != map;
+		assert map.equals(serializedMap);
+	}
+
+	@Test
+	public void testClone() {
+		TolerantMap<String, String> clonedMap = ObjectUtil.clone(map);
+		assert clonedMap != map;
+		assert map.equals(clonedMap);
+	}
+
+	@Test
+	public void testGet() {
+		assert "星期二".equals(map.get("tuesday"));
+		assert "default".equals(map.get(RandomUtil.randomString(6)));
+	}
 }