有关如何使用Option类型消除try / catch块的概述,请参见
Lazy Error Handling in 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>> parseDate =
curry(new F2>() {
public Option f(String pattern, String s) {
try {
return some(new SimpleDateFormat(pattern).parse(s));
}
catch (ParseException e) {
return none();
}
}
});
好的,现在你有一个可重用的日期解析器,不会抛出任何东西,而是返回一个值为Option.None的值来表示失败.以下是您如何使用它:
import fj.data.List;
import static fj.data.Stream.stream;
import static fj.data.Option.isSome_;
....
public Option parseWithPatterns(String s, Stream patterns) {
return stream(s).apply(patterns.map(parseDate)).find(isSome_());
}
这将给您解析匹配的第一个模式的日期,或类型为Option.None的值,这是类型安全的,而null不是.
如果您想知道Stream是… it’s a lazy list.这样可以确保您在第一个成功之后忽略模式.没有必要做太多的工作.
像这样调用你的功能:
for (Date d: parseWithPatterns(someString, stream("dd/MM/yyyy", "dd-MM-yyyy")) {
// Do something with the date here.
}
要么…
Option 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()
}