См. Обработка отложенных ошибок в Java , чтобы узнать, как устранить блоки try / catch, используя тип 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();
}
}
});
Хорошо, теперь у вас есть парсер многоразового использования, который ничего не генерирует, но указывает на ошибку, возвращая значение типа 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()
}