!838 FuncKeyMap的子类,传入可被序列化的keyFunc

Merge pull request !838 from thedwindkee/v5-dev
This commit is contained in:
Looly 2022-10-16 12:40:58 +00:00 committed by Gitee
commit aaf94e317d
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
4 changed files with 29 additions and 5 deletions

View File

@ -7,9 +7,11 @@ import cn.hutool.core.lang.Editor;
import cn.hutool.core.map.FuncKeyMap;
import cn.hutool.core.util.StrUtil;
import java.io.Serializable;
import java.lang.reflect.Type;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
/**
* Bean的值提供者
@ -47,7 +49,8 @@ public class BeanValueProvider implements ValueProvider<String> {
final Map<String, PropDesc> sourcePdMap = BeanUtil.getBeanDesc(source.getClass()).getPropMap(ignoreCase);
// issue#2202@Github
// 如果用户定义了键编辑器则提供的map中的数据必须全部转换key
this.sourcePdMap = new FuncKeyMap<>(new HashMap<>(sourcePdMap.size(), 1), (key) -> {
// issue#I5VRHW@Gitee 使Function可以被序列化
this.sourcePdMap = new FuncKeyMap<>(new HashMap<>(sourcePdMap.size(), 1), (Function<Object, String> & Serializable)(key) -> {
if (ignoreCase && key instanceof CharSequence) {
key = key.toString().toLowerCase();
}

View File

@ -2,8 +2,10 @@ package cn.hutool.core.map;
import cn.hutool.core.util.StrUtil;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
/**
* 驼峰Key风格的Map<br>
@ -72,7 +74,8 @@ public class CamelCaseMap<K, V> extends FuncKeyMap<K, V> {
* @param emptyMapBuilder Map构造器必须构造空的Map
*/
CamelCaseMap(MapBuilder<K, V> emptyMapBuilder) {
super(emptyMapBuilder.build(), (key) -> {
// issue#I5VRHW@Gitee 使Function可以被序列化
super(emptyMapBuilder.build(), (Function<Object, K> & Serializable)(key) -> {
if (key instanceof CharSequence) {
key = StrUtil.toCamelCase(key.toString());
}

View File

@ -1,7 +1,9 @@
package cn.hutool.core.map;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;
/**
* 忽略大小写的Map<br>
@ -72,7 +74,8 @@ public class CaseInsensitiveMap<K, V> extends FuncKeyMap<K, V> {
* @param emptyMapBuilder 被包装的自定义Map创建器
*/
CaseInsensitiveMap(MapBuilder<K, V> emptyMapBuilder) {
super(emptyMapBuilder.build(), (key)->{
// issue#I5VRHW@Gitee 使Function可以被序列化
super(emptyMapBuilder.build(), (Function<Object, K> & Serializable)(key)->{
if (key instanceof CharSequence) {
key = key.toString().toLowerCase();
}

View File

@ -1,10 +1,11 @@
package cn.hutool.core.map;
import cn.hutool.core.util.SerializeUtil;
import org.junit.Assert;
import org.junit.Test;
public class CamelCaseMapTest {
@Test
public void caseInsensitiveMapTest() {
CamelCaseMap<String, String> map = new CamelCaseMap<>();
@ -12,7 +13,7 @@ public class CamelCaseMapTest {
Assert.assertEquals("OK", map.get("customKey"));
Assert.assertEquals("OK", map.get("custom_key"));
}
@Test
public void caseInsensitiveLinkedMapTest() {
CamelCaseLinkedMap<String, String> map = new CamelCaseLinkedMap<>();
@ -20,4 +21,18 @@ public class CamelCaseMapTest {
Assert.assertEquals("OK", map.get("customKey"));
Assert.assertEquals("OK", map.get("custom_key"));
}
@Test
public void serializableKeyFuncTest() {
CamelCaseMap<String, String> map = new CamelCaseMap<>();
map.put("serializable_key", "OK");
CamelCaseMap<String, String> deSerializableMap = SerializeUtil.deserialize(SerializeUtil.serialize(map));
Assert.assertEquals("OK", deSerializableMap.get("serializable_key"));
Assert.assertEquals("OK", deSerializableMap.get("serializableKey"));
deSerializableMap.put("serializable_func", "OK");
Assert.assertEquals("OK", deSerializableMap.get("serializable_func"));
Assert.assertEquals("OK", deSerializableMap.get("serializableFunc"));
}
}