Browse Source

代码优化

Woody 2 weeks ago
parent
commit
293fa5727a

+ 18 - 6
framework-common/src/main/java/com/chelvc/framework/common/jackson/JacksonEnumerateSerializer.java

@@ -1,13 +1,13 @@
 package com.chelvc.framework.common.jackson;
 
 import java.io.IOException;
+import java.lang.reflect.Field;
 import java.util.Map;
 
 import com.chelvc.framework.common.util.ObjectUtils;
 import com.fasterxml.jackson.core.JsonGenerator;
 import com.fasterxml.jackson.databind.SerializerProvider;
 import com.fasterxml.jackson.databind.ser.std.StdSerializer;
-import com.google.common.collect.Maps;
 
 /**
  * JSON枚举序列化处理器
@@ -33,11 +33,23 @@ public class JacksonEnumerateSerializer extends StdSerializer<Object> {
     @Override
     public void serialize(Object value, JsonGenerator generator, SerializerProvider provider) throws IOException {
         if (value instanceof Enum) {
-            String name = ((Enum<?>) value).name();
-            Map<String, Object> values = Maps.newHashMap(ObjectUtils.object2map(value));
-            values.putIfAbsent(CODE, name);
-            values.putIfAbsent(DESCRIPTION, name);
-            generator.writeObject(values);
+            String code = ((Enum<?>) value).name();
+            Map<String, Field> fields = ObjectUtils.getClassFields(value.getClass());
+            generator.writeStartObject();
+            if (!fields.containsKey(CODE)) {
+                generator.writeStringField(CODE, code);
+            }
+            fields.forEach((property, field) -> {
+                try {
+                    generator.writeObjectField(property, ObjectUtils.getObjectValue(value, field));
+                } catch (IOException e) {
+                    throw new RuntimeException(e);
+                }
+            });
+            if (!fields.containsKey(DESCRIPTION)) {
+                generator.writeStringField(DESCRIPTION, code);
+            }
+            generator.writeEndObject();
         } else {
             generator.writeObject(value);
         }

+ 5 - 2
framework-common/src/main/java/com/chelvc/framework/common/model/Paging.java

@@ -107,8 +107,11 @@ public final class Paging implements Serializable {
      * @return 分页信息实例
      */
     public static Paging parse(String text) {
-        return StringUtils.decompose(text, (first, second) -> first == null ? of(DEFAULT_NUMBER, second) :
-                second == null ? of(first, DEFAULT_SIZE) : of(first, second), Integer::parseInt);
+        return StringUtils.decompose(
+                text,
+                (l, r, d) -> of(l == null ? DEFAULT_NUMBER : l, r == null ? DEFAULT_SIZE : r),
+                Integer::parseInt
+        );
     }
 
     /**

+ 11 - 1
framework-common/src/main/java/com/chelvc/framework/common/model/Period.java

@@ -444,7 +444,7 @@ public final class Period implements Serializable {
      * @return 时间周期实例
      */
     public static Period parse(String text) {
-        return StringUtils.decompose(text, Period::of, string -> parse(string, null), Period::parse);
+        return StringUtils.decompose(text, (l, r, d) -> of(l, r), item -> parse(item, null), Period::parse);
     }
 
     /**
@@ -481,6 +481,16 @@ public final class Period implements Serializable {
                 && !this.begin.after(date) && !this.end.before(date);
     }
 
+    /**
+     * 时间周期偏移
+     *
+     * @param amount 偏移量
+     * @return 时间周期实例
+     */
+    public Period offset(@NonNull Duration amount) {
+        return this.offset(Calendar.SECOND, (int) amount.getSeconds());
+    }
+
     /**
      * 时间周期偏移
      *

+ 6 - 1
framework-common/src/main/java/com/chelvc/framework/common/model/Range.java

@@ -38,7 +38,12 @@ public final class Range implements Serializable {
      * @return 范围信息实例
      */
     public static Range parse(String text) {
-        return StringUtils.decompose(text, Range::new, Integer::parseInt);
+        return StringUtils.decompose(text, (l, r, d) -> {
+            if (d < 0) {
+                return new Range(l == null ? r : l, r == null ? l : r);
+            }
+            return new Range(l, r);
+        }, Integer::parseInt);
     }
 
     /**

+ 23 - 21
framework-common/src/main/java/com/chelvc/framework/common/util/StringUtils.java

@@ -18,6 +18,7 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import java.util.zip.CRC32;
 
+import com.chelvc.framework.common.function.MultipleFunction;
 import com.fasterxml.jackson.databind.PropertyNamingStrategy;
 import com.google.common.collect.Maps;
 import lombok.NonNull;
@@ -774,30 +775,31 @@ public final class StringUtils {
      *
      * @param text    字符串文本
      * @param builder 对象构建器
-     * @param parser  前后字符串解析器
-     * @param <T>     前后字符串解析目标对象类型
+     * @param parser  分隔符左右字符串解析器
+     * @param <T>     分隔符左右数据类型
      * @param <R>     返回对象类型
      * @return 对象实例
      */
-    public static <T, R> R decompose(String text, @NonNull BiFunction<T, T, R> builder,
+    public static <T, R> R decompose(String text, @NonNull MultipleFunction<T, T, Integer, R> builder,
                                      @NonNull Function<String, T> parser) {
-        return decompose(text, builder, parser, (string, first) -> parser.apply(string));
+        return decompose(text, builder, parser, (item, first) -> parser.apply(item));
     }
 
     /**
      * 以"_"或","号作为分割符拆分字符串,并对拆分后的字符串进行处理
      *
-     * @param text    字符串文本
-     * @param builder 对象构建器
-     * @param parser1 前字符串解析器
-     * @param parser2 后字符串解析器
-     * @param <T>     前后字符串解析目标对象类型
-     * @param <R>     返回对象类型
+     * @param text        字符串文本
+     * @param builder     对象构建器
+     * @param leftParser  分隔符左边字符串解析器
+     * @param rightParser 分隔符右边字符串解析器
+     * @param <T>         分隔符左边数据类型
+     * @param <U>         分隔符右边数据类型
+     * @param <R>         返回对象类型
      * @return 对象实例
      */
-    public static <T, U, R> R decompose(String text, @NonNull BiFunction<T, U, R> builder,
-                                        @NonNull Function<String, T> parser1,
-                                        @NonNull BiFunction<String, T, U> parser2) {
+    public static <T, U, R> R decompose(String text, @NonNull MultipleFunction<T, U, Integer, R> builder,
+                                        @NonNull Function<String, T> leftParser,
+                                        @NonNull BiFunction<String, T, U> rightParser) {
         if (isEmpty(text) || (text = text.trim()).isEmpty()
                 || (text.charAt(0) == '(' && text.charAt(text.length() - 1) == ')'
                 && (text = text.substring(1, text.length() - 1).trim()).isEmpty())) {
@@ -816,23 +818,23 @@ public final class StringUtils {
 
         // 字符串解析
         String item;
-        T first = null;
-        U second = null;
+        T left = null;
+        U right = null;
         if (delimiter < 0) {
-            first = parser1.apply(text);
+            left = leftParser.apply(text);
         } else if (delimiter == 0 && !(item = text.substring(1).trim()).isEmpty()) {
-            second = parser2.apply(item, null);
+            right = rightParser.apply(item, null);
         } else if (delimiter == text.length() - 1 && !(item = text.substring(0, text.length() - 1).trim()).isEmpty()) {
-            first = parser1.apply(item);
+            left = leftParser.apply(item);
         } else if (delimiter > 0 && delimiter < text.length() - 1) {
             if (!(item = text.substring(0, delimiter).trim()).isEmpty()) {
-                first = parser1.apply(item);
+                left = leftParser.apply(item);
             }
             if (!(item = text.substring(delimiter + 1).trim()).isEmpty()) {
-                second = parser2.apply(item, first);
+                right = rightParser.apply(item, left);
             }
         }
-        return builder.apply(first, second);
+        return builder.apply(left, right, delimiter);
     }
 
     /**