在这种情况下,我正在读取大约13万条记录,其中包含存储为String字段的日期。一些记录包含空格(空),一些包含这样的字符串:“ dd-MMM-yy”,而另一些包含此“ dd / MM / yyyy”。
我写了这样的方法:
public Date parsedate(String date){
if(date !== null){
try{
1. create a SimpleDateFormat object using 'dd-MMM-yy' as the pattern
2. parse the date
3. return the parsed date
}catch(ParseException e){
try{
1. create a SimpleDateFormat object using 'dd/MM/yyy' as the pattern
2. parse the date
3. return parsed date
}catch(ParseException e){
return null
}
}
}else{
return null
}
}
因此,您可能已经发现了问题。我正在使用try .. catch作为我逻辑的一部分。最好事先确定String实际上包含某种格式的可解析日期,然后再尝试解析它。
那么,是否有一些API或库可以帮助您解决此问题?我不介意编写几种不同的Parse类来处理不同的格式,然后创建一个工厂来选择正确的6类,但是,如何确定哪一个呢?
谢谢。
有关如何使用类型消除try / catch块的概述,请参见Java中的惰性错误处理Option
。
功能性Java是您的朋友。
本质上,您想要做的是将日期解析包装在一个不会抛出任何东西的函数中,而是在其返回类型中指示解析是否成功。例如:
import fj.F; import fj.F2;
import fj.data.Option;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import static fj.Function.curry;
import static fj.Option.some;
import static fj.Option.none;
...
F<String, F<String, Option<Date>>> parseDate =
curry(new F2<String, String, Option<Date>>() {
public Option<Date> f(String pattern, String s) {
try {
return some(new SimpleDateFormat(pattern).parse(s));
}
catch (ParseException e) {
return none();
}
}
});
好的,现在您有了一个可重用的日期解析器,它不会抛出任何东西,但是会通过返回type值来指示失败Option.None
。使用方法如下:
import fj.data.List;
import static fj.data.Stream.stream;
import static fj.data.Option.isSome_;
....
public Option<Date> parseWithPatterns(String s, Stream<String> patterns) {
return stream(s).apply(patterns.map(parseDate)).find(isSome_());
}
这将为您提供与第一个匹配的模式(或类型为Option.None的值)解析的日期,该值是类型安全的,而null不是。
如果您想知道什么Stream
是...,这是一个懒惰的清单。这样可以确保您在第一个成功的模式之后忽略模式。不需要做太多的工作。
像这样调用您的函数:
for (Date d: parseWithPatterns(someString, stream("dd/MM/yyyy", "dd-MM-yyyy")) {
// Do something with the date here.
}
要么...
Option<Date> d = parseWithPatterns(someString,
stream("dd/MM/yyyy", "dd-MM-yyyy"));
if (d.isNone()) {
// Handle the case where neither pattern matches.
}
else {
// Do something with d.some()
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句