我有一种情况,我会得到一个字符串,我需要确定是什么 Class<?>
考虑到以下限制,最适合其值(value):
- 如果字符串(忽略大小写)等于
"true"
或"false"
, 这是一个Boolean
- 否则,如果字符串是不带小数点的整数,则为
Integer
- 否则,如果字符串是数字,则为
Double
- 否则,如果字符串匹配日期时间格式
YYYY-MM-DD hh:mm:ss.sss
, 那么它是一个 JavaDate
- 否则它只是一个
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/