增加convertValue方法

This commit is contained in:
redkale
2023-08-04 17:55:18 +08:00
parent be11b0767e
commit 82b64c2e38
2 changed files with 65 additions and 36 deletions

View File

@@ -263,7 +263,7 @@ public final class CacheMemorySource extends AbstractCacheSource {
}
entry.lock();
try {
entry.objectValue = formatValue(type, value);
entry.objectValue = Utility.convertValue(type, value);
entry.expireSeconds(expireSeconds);
entry.lastAccessed = System.currentTimeMillis();
} finally {
@@ -496,9 +496,9 @@ public final class CacheMemorySource extends AbstractCacheSource {
// OBJECT, ATOMIC, DOUBLE, SSET, ZSET, LIST, MAP;
switch (entry.cacheType) {
case ATOMIC:
return formatValue(type, (AtomicLong) entry.objectValue);
return Utility.convertValue(type, (AtomicLong) entry.objectValue);
case DOUBLE:
return formatValue(type, Double.longBitsToDouble(((AtomicLong) entry.objectValue).intValue()));
return Utility.convertValue(type, Double.longBitsToDouble(((AtomicLong) entry.objectValue).intValue()));
case SSET:
return (T) new LinkedHashSet(entry.setValue);
case ZSET:
@@ -648,7 +648,7 @@ public final class CacheMemorySource extends AbstractCacheSource {
}
entry.lock();
try {
boolean rs = entry.mapValue.putIfAbsent(field, formatValue(type, value)) == null;
boolean rs = entry.mapValue.putIfAbsent(field, Utility.convertValue(type, value)) == null;
entry.lastAccessed = System.currentTimeMillis();
return rs;
} finally {
@@ -683,7 +683,7 @@ public final class CacheMemorySource extends AbstractCacheSource {
Map map = entry.mapValue;
List<T> rs = new ArrayList<>(fields.length);
for (String field : fields) {
rs.add((T) formatValue(type, map.get(field)));
rs.add((T) Utility.convertValue(type, map.get(field)));
}
return rs;
});
@@ -698,7 +698,7 @@ public final class CacheMemorySource extends AbstractCacheSource {
} else {
Map map = new LinkedHashMap();
entry.mapValue.forEach((k, v) -> {
map.put(k, formatValue(type, v));
map.put(k, Utility.convertValue(type, v));
});
return map;
}
@@ -712,7 +712,7 @@ public final class CacheMemorySource extends AbstractCacheSource {
if (entry == null) {
return new ArrayList();
} else {
return new ArrayList(entry.mapValue.values().stream().map(v -> formatValue(type, v)).toList());
return new ArrayList(entry.mapValue.values().stream().map(v -> Utility.convertValue(type, v)).toList());
}
});
}
@@ -748,7 +748,7 @@ public final class CacheMemorySource extends AbstractCacheSource {
return null;
}
Object obj = entry.mapValue.get(field);
return obj == null ? null : formatValue(type, obj);
return obj == null ? null : Utility.convertValue(type, obj);
});
}
@@ -786,7 +786,7 @@ public final class CacheMemorySource extends AbstractCacheSource {
}
entry.lock();
try {
entry.mapValue.put(field, formatValue(type, value));
entry.mapValue.put(field, Utility.convertValue(type, value));
entry.lastAccessed = System.currentTimeMillis();
} finally {
entry.unlock();
@@ -941,7 +941,7 @@ public final class CacheMemorySource extends AbstractCacheSource {
}
entry.lock();
try {
return formatValue(componentType, entry.listValue.pollFirst());
return Utility.convertValue(componentType, entry.listValue.pollFirst());
} finally {
entry.unlock();
}
@@ -993,7 +993,7 @@ public final class CacheMemorySource extends AbstractCacheSource {
}
entry.lock();
try {
return formatValue(componentType, entry.listValue.pollLast());
return Utility.convertValue(componentType, entry.listValue.pollLast());
} finally {
entry.unlock();
}
@@ -1077,7 +1077,7 @@ public final class CacheMemorySource extends AbstractCacheSource {
for (int i = 0; i < Math.abs(count); i++) {
int index = ThreadLocalRandom.current().nextInt(vals.size());
T val = vals.get(index);
list.add(formatValue(componentType, val));
list.add(Utility.convertValue(componentType, val));
}
} else { //不可以重复
if (count >= vals.size()) {
@@ -1424,7 +1424,7 @@ public final class CacheMemorySource extends AbstractCacheSource {
Set<T> list = new LinkedHashSet<>();
int index = 0;
while (it.hasNext()) {
list.add(formatValue(componentType, it.next()));
list.add(Utility.convertValue(componentType, it.next()));
if (++index >= count) {
break;
}
@@ -1453,7 +1453,7 @@ public final class CacheMemorySource extends AbstractCacheSource {
Iterator it = cset.iterator();
Set<T> list = new LinkedHashSet<>();
while (it.hasNext()) {
list.add((T) formatValue(componentType, it.next()));
list.add((T) Utility.convertValue(componentType, it.next()));
}
return list;
} finally {
@@ -1714,28 +1714,6 @@ public final class CacheMemorySource extends AbstractCacheSource {
});
}
private <T> T formatValue(@Nullable Type componentType, Object obj) {
if (componentType == null || obj == null || componentType == obj.getClass()) {
return (T) obj;
}
if (componentType == String.class) {
obj = obj.toString();
} else if (componentType == long.class || componentType == Long.class) {
if (obj instanceof Number) {
obj = ((Number) obj).longValue();
} else {
obj = Long.parseLong(obj.toString());
}
} else if (componentType == int.class || componentType == Integer.class) {
if (obj instanceof Number) {
obj = ((Number) obj).intValue();
} else {
obj = Integer.parseInt(obj.toString());
}
}
return (T) obj;
}
@Override
public CompletableFuture<Long> dbsizeAsync() {
return supplyFuture(() -> {

View File

@@ -23,6 +23,7 @@ import java.util.stream.Stream;
import java.util.zip.GZIPInputStream;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;
import org.redkale.convert.json.JsonConvert;
/**
*
@@ -2681,6 +2682,56 @@ public final class Utility {
return -1;
}
/**
* 将源对象转换成目标类型
*
* @param <T> 泛型
* @param type 目标类型
* @param value 源对象
*
* @return 对象
*/
public static <T> T convertValue(Type type, Object value) {
if (type == null || value == null) {
return (T) value;
}
final Class clazz = TypeToken.typeToClass(type);
final Class vclz = value.getClass();
if (clazz == vclz) {
return (T) value;
} else if (clazz == String.class) {
return (T) value.toString();
} else if (clazz.isAssignableFrom(vclz)) {
return (T) value;
} else if (clazz == double.class || clazz == Double.class) {
if (value instanceof Number) {
return (T) (Number) ((Number) value).doubleValue();
}
} else if (clazz == float.class || clazz == Float.class) {
if (value instanceof Number) {
return (T) (Number) ((Number) value).floatValue();
}
} else if (clazz == long.class || clazz == Long.class) {
if (value instanceof Number) {
return (T) (Number) ((Number) value).longValue();
}
} else if (clazz == int.class || clazz == Integer.class) {
if (value instanceof Number) {
return (T) (Number) ((Number) value).intValue();
}
} else if (clazz == short.class || clazz == Short.class) {
if (value instanceof Number) {
return (T) (Number) ((Number) value).shortValue();
}
} else if (clazz == byte.class || clazz == Byte.class) {
if (value instanceof Number) {
return (T) (Number) ((Number) value).byteValue();
}
}
JsonConvert convert = JsonConvert.root();
return convert.convertFrom(type, convert.convertToBytes(value));
}
/**
* 将buffer的内容转换成字符串, string参数不为空时会追加在buffer内容字符串之前
*