From 28600e7102be098dbe0530b3ff81784ae8a0aeb4 Mon Sep 17 00:00:00 2001 From: godotg Date: Fri, 19 Jul 2024 21:45:50 +0800 Subject: [PATCH] ref[storage]: refactor convert --- .../interpreter/ResourceInterpreter.java | 4 +--- .../zfoo/storage/strategy/ListConverter.java | 4 +--- .../zfoo/storage/strategy/SetConverter.java | 4 +--- .../com/zfoo/storage/util/ConvertUtils.java | 20 ++++++------------ .../storage/resource/StudentResource.java | 16 ++++++++++++++ .../test/resources/excel/StudentResource.xlsx | Bin 9228 -> 9955 bytes 6 files changed, 25 insertions(+), 23 deletions(-) diff --git a/storage/src/main/java/com/zfoo/storage/interpreter/ResourceInterpreter.java b/storage/src/main/java/com/zfoo/storage/interpreter/ResourceInterpreter.java index 44768bc3..6059a6ea 100644 --- a/storage/src/main/java/com/zfoo/storage/interpreter/ResourceInterpreter.java +++ b/storage/src/main/java/com/zfoo/storage/interpreter/ResourceInterpreter.java @@ -81,9 +81,7 @@ public class ResourceInterpreter { for (var fieldInfo : fieldInfos) { var content = columns.get(fieldInfo.index); - if (StringUtils.isNotEmpty(content) || fieldInfo.field.getType() == String.class) { - inject(instance, fieldInfo.field, content); - } + inject(instance, fieldInfo.field, content); } result.add(instance); } diff --git a/storage/src/main/java/com/zfoo/storage/strategy/ListConverter.java b/storage/src/main/java/com/zfoo/storage/strategy/ListConverter.java index 1d57f80d..e9d231a7 100644 --- a/storage/src/main/java/com/zfoo/storage/strategy/ListConverter.java +++ b/storage/src/main/java/com/zfoo/storage/strategy/ListConverter.java @@ -56,9 +56,7 @@ public class ListConverter implements ConditionalGenericConverter { clazz = (Class) type; } if (content.startsWith("[") || content.endsWith("]")) { - return clazz.equals(List.class) - ? Collections.unmodifiableList(JsonUtils.string2List(content, clazz)) - : JsonUtils.string2List(content, clazz); + return Collections.unmodifiableList(JsonUtils.string2List(content, clazz)); } return ConvertUtils.convertToList(content, clazz); } diff --git a/storage/src/main/java/com/zfoo/storage/strategy/SetConverter.java b/storage/src/main/java/com/zfoo/storage/strategy/SetConverter.java index 38da5597..0d2a71dc 100644 --- a/storage/src/main/java/com/zfoo/storage/strategy/SetConverter.java +++ b/storage/src/main/java/com/zfoo/storage/strategy/SetConverter.java @@ -55,9 +55,7 @@ public class SetConverter implements ConditionalGenericConverter { clazz = (Class) type; } if (content.startsWith("[") || content.endsWith("]")) { - return clazz.equals(Set.class) - ? Collections.unmodifiableSet(JsonUtils.string2Set(content, clazz)) - : JsonUtils.string2Set(content, clazz); + return Collections.unmodifiableSet(JsonUtils.string2Set(content, clazz)); } return ConvertUtils.convertToSet(content, clazz); } diff --git a/storage/src/main/java/com/zfoo/storage/util/ConvertUtils.java b/storage/src/main/java/com/zfoo/storage/util/ConvertUtils.java index 82dd9f05..8770b702 100644 --- a/storage/src/main/java/com/zfoo/storage/util/ConvertUtils.java +++ b/storage/src/main/java/com/zfoo/storage/util/ConvertUtils.java @@ -34,6 +34,7 @@ public abstract class ConvertUtils { var converters = new HashSet<>(); converters.add(new ArrayConverter()); converters.add(new ListConverter()); + converters.add(new SetConverter()); converters.add(new JsonToMapConverter()); converters.add(new JsonToObjectConverter()); converters.add(new StringToClassConverter()); @@ -60,12 +61,10 @@ public abstract class ConvertUtils { return Array.newInstance(componentType, 0); } // 用普通的逗号分隔符解析 - var splits = content.split(StringUtils.COMMA_REGEX); - var length = splits.length; - Object array = Array.newInstance(componentType, length); - for (var i = 0; i < length; i++) { - Object value = ConvertUtils.convert(StringUtils.trim(splits[i]), componentType); - Array.set(array, i, value); + var list = convertToList(content, componentType); + Object array = Array.newInstance(componentType, list.size()); + for (var i = 0; i < list.size(); i++) { + Array.set(array, i, list.get(i)); } return array; } @@ -90,13 +89,6 @@ public abstract class ConvertUtils { if (StringUtils.isEmpty(content)) { return Collections.emptySet(); } - var splits = content.split(StringUtils.COMMA_REGEX); - var length = splits.length; - var set = new HashSet(); - for (var i = 0; i < length; i++) { - var value = ConvertUtils.convert(StringUtils.trim(splits[i]), type); - set.add(value); - } - return Collections.unmodifiableSet(set); + return Set.copyOf(convertToList(content, type)); } } diff --git a/storage/src/test/java/com/zfoo/storage/resource/StudentResource.java b/storage/src/test/java/com/zfoo/storage/resource/StudentResource.java index 379793ab..5f613ca8 100644 --- a/storage/src/test/java/com/zfoo/storage/resource/StudentResource.java +++ b/storage/src/test/java/com/zfoo/storage/resource/StudentResource.java @@ -19,6 +19,7 @@ import com.zfoo.storage.anno.Index; import com.zfoo.storage.anno.Storage; import java.util.List; +import java.util.Set; /** * @author godotg @@ -39,6 +40,9 @@ public class StudentResource { private int age; private float score; private String[] courses; + private int[] intArray; + private List intList; + private Set intSet; private User[] users; private List userList; private User user; @@ -67,6 +71,18 @@ public class StudentResource { return courses; } + public int[] getIntArray() { + return intArray; + } + + public List getIntList() { + return intList; + } + + public Set getIntSet() { + return intSet; + } + public User[] getUsers() { return users; } diff --git a/storage/src/test/resources/excel/StudentResource.xlsx b/storage/src/test/resources/excel/StudentResource.xlsx index 8ac64b66abec6b89d56df7e2e3d37eaec5f85ab6..88dda96ad78d417a73e1c4de5e133902a8eb582b 100644 GIT binary patch delta 6000 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 J0MlQ{{{Wh}Lp=Zh delta 5228 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 KaG&+>&c6UEey>~r