有关如何使用类型消除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()}


