silentbalanceyh/vertx-zero

View on GitHub
vertx-gaia/vertx-ams/src/main/java/io/horizon/util/_Value.java

Summary

Maintainability
B
4 hrs
Test Coverage
package io.horizon.util;

import io.horizon.eon.VValue;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.function.Function;

/**
 * @author lang : 2023/4/27
 */
class _Value extends _To {
    protected _Value() {
    }

    /**
     * (计算过时区)获取当前时间,转换成 Date 值
     *
     * @return Date
     */
    public static Date valueNow() {
        return TPeriod.parse(LocalDateTime.now());
    }

    /**
     * 返回安全的JsonObject对象,去掉了null pointer引起的各种问题,该版本中
     * 最终的结果一定会返回一个可操作的JsonObject对象。
     *
     * @param inputJ 输入的JsonObject对象
     *
     * @return 安全的JsonObject对象
     */
    public static JsonObject valueJObject(final JsonObject inputJ) {
        return HJson.valueJObject(inputJ, false);
    }

    /**
     * 返回安全的JsonArray对象,去掉了null pointer引起的各种问题,该版本中
     * 最终的结果一定会返回一个可操作的JsonArray对象。
     *
     * @param inputA 输入的JsonArray对象
     *
     * @return 安全的JsonArray对象
     */
    public static JsonArray valueJArray(final JsonArray inputA) {
        return HJson.valueJArray(inputA, false);
    }

    /**
     * 返回安全的JsonObject对象,去掉了null pointer引起的各种问题,该版本中
     * 最终的结果一定会返回一个可操作的JsonObject对象(返回副本)。
     *
     * @param inputJ 输入的JsonObject对象
     * @param isCopy 是否返回副本
     *
     * @return 安全的JsonObject对象或副本
     */
    public static JsonObject valueJObject(final JsonObject inputJ, final boolean isCopy) {
        return HJson.valueJObject(inputJ, isCopy);
    }

    /**
     * 返回安全的JsonArray对象,去掉了null pointer引起的各种问题,该版本中
     * 最终的结果一定会返回一个可操作的JsonArray对象(返回副本)。
     *
     * @param inputA 输入的JsonArray对象
     * @param isCopy 是否返回副本
     *
     * @return 安全的JsonArray对象或副本
     */

    public static JsonArray valueJArray(final JsonArray inputA, final boolean isCopy) {
        return HJson.valueJArray(inputA, isCopy);
    }

    /**
     * 从 JsonArray 中提取某个字段的属性值,并且转换成 JsonArray 集
     *
     * @param array JsonArray
     * @param field 字段名
     *
     * @return JsonArray
     */
    public static JsonArray valueJArray(final JsonArray array, final String field) {
        return HJson.toJArray(valueSetString(array, field));
    }

    /**
     * 从 JsonObject 中提取指定字段的值,如果该字段不存在或者值为null
     * 1. 为 null 返回 JsonObject
     * 2. 如果类型不匹配也返回 JsonObject
     *
     * @param inputJ JsonObject
     * @param field  字段名
     *
     * @return JsonObject
     */
    public static JsonObject valueJObject(final JsonObject inputJ, final String field) {
        return HJson.valueJObject(inputJ, field, false);
    }

    /**
     * 从 JsonObject 中提取指定字段的值,如果该字段不存在或者值为null
     * 1. 为 null 返回 JsonObject
     * 2. 如果类型不匹配也返回 JsonObject
     * 3. 如果 isCopy 为 true,返回副本
     *
     * @param inputJ JsonObject
     * @param field  字段名
     * @param isCopy 是否创建拷贝
     *
     * @return JsonObject
     */
    public static JsonObject valueJObject(final JsonObject inputJ, final String field, final boolean isCopy) {
        return HJson.valueJObject(inputJ, field, isCopy);
    }

    /**
     * 从 JsonObject 中提取指定字段的值,如果该字段不存在或者值为null
     * 1. 为 null 返回 JsonArray
     * 2. 如果类型不匹配也返回 JsonArray
     *
     * @param inputJ JsonObject
     * @param field  字段名
     *
     * @return JsonArray
     */
    public static JsonArray valueJArray(final JsonObject inputJ, final String field) {
        return HJson.valueJArray(inputJ, field);
    }

    /**
     * 映射计算,提取 JsonArray 中的制定字段的值,合并成一个 Set<String>
     *
     * @param array JsonArray
     * @param field 字段名
     *
     * @return Set<String>
     */
    public static Set<String> valueSetString(final JsonArray array, final String field) {
        return TV.vStringSet(array, field);
    }

    /**
     * 映射计算,带提取函数,提取 List<T> 中的制定字段的值,合并成一个 Set<String>
     *
     * @param list     List<T>
     * @param executor 提取函数
     * @param <T>      T
     *
     * @return Set<String>
     */
    public static <T> Set<String> valueSetString(final List<T> list, final Function<T, String> executor) {
        return TV.vStringSet(list, executor);
    }

    /**
     * (二维计算)映射计算,提取 JsonArray 中的制定字段的值,合并成一个 Set<JsonArray>
     *
     * @param array JsonArray
     * @param field 字段名
     *
     * @return Set<JsonArray>
     */
    public static Set<JsonArray> valueSetArray(final JsonArray array, final String field) {
        return TV.vArraySet(array, field);
    }


    /**
     * 查找第一个匹配转换函数的字符串
     *
     * @param list     列表
     * @param stringFn 转换函数
     * @param <T>      T
     *
     * @return 字符串
     */
    public static <T> String valueFirst(final List<T> list, final Function<T, String> stringFn) {
        return list.stream().map(stringFn).findFirst().orElse(null);
    }

    /**
     * 提取某个属性(唯一字符串),如果不唯一则返回 null
     *
     * @param array JsonArray
     * @param field 字段名
     *
     * @return String
     */
    public static String valueString(final JsonArray array, final String field) {
        return TV.vString(array, field);
    }

    /**
     * (带非空检查)提取 JsonObject 中某个 String 属性值
     *
     * @param json  JsonObject
     * @param field 字段名
     *
     * @return String
     */
    public static String valueString(final JsonObject json, final String field) {
        return TV.vString(json, field, null);
    }

    /**
     * (带非空检查)提取 JsonObject 中某个 String 属性值
     *
     * @param json         JsonObject
     * @param field        字段名
     * @param defaultValue 默认值
     *
     * @return String
     */
    public static String valueString(final JsonObject json, final String field, final String defaultValue) {
        return TV.vString(json, field, defaultValue);
    }

    /**
     * (带非空检查)提取 JsonObject 中某个 Integer 属性值
     *
     * @param json  JsonObject
     * @param field 字段名
     *
     * @return String
     */
    public static Integer valueInt(final JsonObject json, final String field) {
        return TV.vInt(json, field, VValue.RANGE);
    }

    /**
     * (带非空检查)提取 JsonObject 中某个 String 属性值,并转换成 Class<?>
     *
     * @param json  JsonObject
     * @param field 字段名
     *
     * @return String
     */
    public static Class<?> valueC(final JsonObject json, final String field) {
        return TV.vClass(json, field, null);
    }

    /**
     * (带非空检查)提取 JsonObject 中某个 String 属性值,并转换成 Class<?>
     *
     * @param json         JsonObject
     * @param field        字段名
     * @param defaultClass 默认值
     *
     * @return String
     */
    public static Class<?> valueC(final JsonObject json, final String field,
                                  final Class<?> defaultClass) {
        return TV.vClass(json, field, defaultClass);
    }

    /**
     * (带非空检查)提取 JsonObject 中某个 String 属性值,并转换成 Class<?>,且该 Class<?>
     * 必须是实现了 interfaceCls 的
     *
     * @param json         JsonObject
     * @param field        字段名
     * @param interfaceCls 接口类
     *
     * @return String
     */
    public static Class<?> valueCI(final JsonObject json, final String field,
                                   final Class<?> interfaceCls) {
        return TV.vClass(json, field, interfaceCls, null);
    }

    /**
     * (带非空检查)提取 JsonObject 中某个 String 属性值,并转换成 Class<?>,且该 Class<?>
     * 必须是实现了 interfaceCls 的
     *
     * @param json         JsonObject
     * @param field        字段名
     * @param interfaceCls 接口类
     * @param defaultClass 默认值
     *
     * @return String
     */
    public static Class<?> valueCI(final JsonObject json, final String field,
                                   final Class<?> interfaceCls, final Class<?> defaultClass) {
        return TV.vClass(json, field, interfaceCls, defaultClass);
    }

    /**
     * (带非空检查)将 String 属性值,并转换成 Class<?>,且该 Class<?>
     *
     * @param literal 字符串
     * @param type    类型
     * @param <T>     T
     *
     * @return Class<?>
     */
    public static <T> T valueT(final String literal, final Class<?> type) {
        return TV.vT(literal, type);
    }

    /**
     * 从 JsonObject 数据中提取 field 属性的数据,并执行 type
     * 检查,若 type 匹配(==)则返回该数据,否则返回 null
     *
     * @param json  JsonObject
     * @param field 字段名
     * @param type  类型
     * @param <T>   T
     *
     * @return T
     */
    public static <T> T valueT(final JsonObject json, final String field, final Class<T> type) {
        return TV.vT(json, field, type);
    }

    /**
     * 「副作用方法」
     * 从 source 的 JsonObject 中拷贝 fields 属性相关信息到 target,该方法会改写 target
     * 拷贝对应属性过来,如果 source 中不存在该属性,则不拷贝
     *
     * @param target 目标
     * @param source 源
     * @param fields 字段
     *
     * @return JsonObject
     */
    public static JsonObject valueCopy(final JsonObject target, final JsonObject source, final String... fields) {
        return TValue.valueCopy(target, source, fields);
    }

    /**
     * 「副作用方法」
     * 将 record ( JsonObject 对象 )本身的 from 属性拷贝到 to 属性
     *
     * @param record JsonObject
     * @param from   from
     * @param to     to
     *
     * @return JsonObject
     */
    public static JsonObject valueCopy(final JsonObject record, final String from, final String to) {
        return TValue.valueCopy(record, from, to);
    }

    /**
     * 将 sources 中的属性逐渐追加到 target 中,如果 target 中已经存在该属性,则不追加
     *
     * @param target  目标
     * @param sources 源
     *
     * @return JsonObject
     */
    public static JsonObject valueAppend(final JsonObject target, final JsonObject... sources) {
        Arrays.stream(sources).forEach(source -> TValue.valueAppend(target, source, true));
        return target;
    }

    /**
     * 使用 sources 中的属性逐渐覆盖 target 中的属性,直接覆盖,类似前端的 Object.assign
     *
     * @param target  目标
     * @param sources 源
     *
     * @return JsonObject
     */
    public static JsonObject valueMerge(final JsonObject target, final JsonObject... sources) {
        Arrays.stream(sources).forEach(source -> TValue.valueMerge(target, source));
        return target;
    }

    /**
     * 为 record (JsonObject类型)的对象追加默认值,如果 record 中的属性已经有值且值不为 null 时则追加
     * 1. 如果追加的 value 是 null 也会生效
     * 2. field 为空则跳过,record 为空则是 valueJObject 效果(返回 JsonObject 对象)
     * 3. 如果是 String 类型,只检查 null,不检查空字符串
     *
     * @param record JsonObject
     * @param field  字段名
     * @param value  默认值
     *
     * @return JsonObject
     */
    public static JsonObject valueDefault(final JsonObject record, final String field, final Object value) {
        return TValue.valueDefault(record, field, value);
    }

    /**
     * 为 record (JsonObject类型)的对象追加默认值,如果 record 中的属性已经有值且值不为 null 时则追加
     * 1. 如果追加的 value 是 null 也会生效
     * 2. field 为空则跳过,record 为空则是 valueJObject 效果(返回 JsonObject 对象)
     * 3. 如果是 String 类型,只检查 null,不检查空字符串
     *
     * @param record JsonObject
     * @param field  字段名
     *
     * @return JsonObject
     */
    public static JsonObject valueDefault(final JsonObject record, final String field) {
        return TValue.valueDefault(record, field, null);
    }

    // ------------- 原 if 系方法(同步模式使用新API)-------------

    /**
     * 「属性序列化/副作用」
     * 提取 JsonObject 记录中所有的 fields 属性,检查属性是否存在且不为空,若存在且不为空则
     * 检查该属性的值是否 JsonObject / JsonArray 类型,如果是这种类型,直接调用该类型的
     * encode() 方法,将这些属性转换成 String 格式
     *
     * @param json   JsonObject
     * @param fields 字段名
     *
     * @return JsonObject(修改过的)
     */
    public static JsonObject valueToString(final JsonObject json, final String... fields) {
        Arrays.stream(fields).forEach(field -> TValue.valueToString(json, field));
        return json;
    }

    /**
     * 「属性序列化/副作用」
     * 提取 JsonArray 记录中所有JsonObject对象的 fields 属性,检查属性是否存在且不为空,
     * 若存在且不为空则检查该属性的值是否 JsonObject / JsonArray 类型,如果是这种类型,
     * 直接调用该类型的encode() 方法,将这些属性转换成 String 格式(迭代执行)
     *
     * @param array  JsonArray
     * @param fields 字段名
     *
     * @return JsonArray(修改过的)
     */
    public static JsonArray valueToString(final JsonArray array, final String... fields) {
        HIter.itJArray(array).forEach(json -> valueToString(json, fields));
        return array;
    }

    /**
     * 「属性序列化/副作用」
     * 提取 JsonObject 记录中的所有 fields 属性相关信息,并执行智能化序列化
     * 1. String 格式包括:[] / {}
     * 2. 解析之后转换成 JsonObject / JsonArray
     * 3. 根对象:JsonObject / JsonArray
     * ---> JsonObject 属性递归
     * ---> JsonArray 属性递归
     *
     * @param json   JsonObject
     * @param fields 字段名
     *
     * @return JsonObject(修改过的)
     */
    public static JsonObject valueToJObject(final JsonObject json, final String... fields) {
        Arrays.stream(fields).forEach(field -> TValue.valueToJson(json, field));
        return json;
    }


    /**
     * 「属性序列化/副作用」
     * 提取 JsonArray 记录中的所有 fields 属性相关信息,并执行智能化序列化
     * 1. String 格式包括:[] / {}
     * 2. 解析之后转换成 JsonObject / JsonArray
     * 3. 根对象:JsonObject / JsonArray
     * ---> JsonObject 属性递归
     * ---> JsonArray 属性递归
     *
     * @param array  JsonArray
     * @param fields 字段名
     *
     * @return JsonArray(修改过的)
     */
    public static JsonArray valueToJArray(final JsonArray array, final String... fields) {
        HIter.itJArray(array).forEach(json -> valueToJObject(json, fields));
        return array;
    }

    /**
     * 「属性序列化/副作用」
     * 和 valueDefault 近似,但是 valueDefault 只是追加默认值(无值时才执行),该方法不管
     * 有没有值都会执行,所以是 valueMerge,直接覆盖属性对应值,造成最终结果集
     *
     * @param input JsonObject
     * @param field 字段名
     * @param value 默认值
     * @param <T>   泛型
     *
     * @return JsonObject
     */
    public static <T> JsonObject valueMerge(final JsonObject input,
                                            final String field, final T value) {
        TValue.valueMerge(input, field, value);
        return input;
    }
}