java - 在 Groovy 中推断字符串值类型

标签 java date reflection groovy introspection

我有一种情况,我会得到一个字符串,我需要确定是什么 Class<?>考虑到以下限制,最适合其值(value):

  • 如果字符串(忽略大小写)等于 "true""false" , 这是一个 Boolean
  • 否则,如果字符串是不带小数点的整数,则为 Integer
  • 否则,如果字符串是数字,则为 Double
  • 否则,如果字符串匹配日期时间格式YYYY-MM-DD hh:mm:ss.sss , 那么它是一个 Java Date
  • 否则它只是一个String毕竟

我最好的尝试是令人讨厌的并且涉及很多嵌套 try/catch block :

// Groovy pseudo-code
Class<?> determineValueType(String value) {
    Class<?> clazz
    if(value.equalsIgnoreCase('true') || value.equalsIgnoreCase('false')) {
        clazz = Boolean
    } else {
        try {
            Integer.parse(value)
            clazz = Integer
        } catch(Exception ex1) {
            try {
                Double.parse(value)
                clazz = Double
            } catch(Exception ex2) {
                try {
                    Date.parse('YYYY-MM-DD hh:mm:ss.sss', value)
                    clazz = Date
                } catch(Exception ex3) {
                    clazz = String
                }
            }
        }
    }

    clazz
}

是否有任何 Groovier 方法可以实现这一点,也许是某些晦涩的 Groovy 反射 API 特有的方法?

最佳答案

在 Groovy 的扩展 String 中有两种方法可以帮助您类(实际上在 CharSequence 上):

但对于其他情况,AFAIK,您需要自己实现解析。您可以尝试使用 map 和一些闭包,以减少一些样板文件:

Class parse(val) {
    def convert = [
        (Integer) : { it.toInteger() },
        (Double)  : { it.toDouble() },
        (Date)    : { Date.parse('YYYY-MM-DD hh:mm:ss.sss', it) },
        (Boolean) : { Boolean.parseBoolean it },
        (String)  : { it }
    ]

    convert.findResult { key, value ->
        try {
            if (value(val)) return key
        } catch (e) {}
    }
}

assert parse('9.1') == Double
assert parse('9') == Integer
assert parse('1985-10-26 01:22:00.000') == Date // great scott!
assert parse('chicken') == String
assert parse('True') == Boolean

请注意,如果 (Double) 位于 (Integer) 之前,则测试将不起作用,因为 9 既是 double 又是整数.

关于java - 在 Groovy 中推断字符串值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38596852/

相关文章:

javascript - 如何使用 JavaScript 获取特定语言环境的日期?

scala - 是否可以使用 scala 脚本中的 scalap?

java 相当于 __func__

java - 如何轻松地将本地文件发送到 Scala 中的 Google Cloud Storage

shell - 如何在 shell 脚本中将以秒为单位的 UTC 时间戳转换为人类可读的本地时间?

java - Tomcat 无法在 Servlet 3.0 中为 JSP 编译类

javascript - 如何解决年份变化时天数不匹配的问题

java - 使用反射获取私有(private)非原始字段的值

java - 如何在 Mac OS 的 Java 中获取 User ~/Library 路径

java - 确定 java 关闭钩子(Hook)线程中的退出状态