在Java 8中使用FP习惯用法时,异常(尤其是已检查的异常)会严重中断程序逻辑的流程.以下是一个任意示例:
String s1 = "oeu", s2 = "2";
Stream.of(s1, s2).forEach(s ->
System.out.println(Optional.of(s).map(Integer::parseInt).get()));
Run Code Online (Sandbox Code Playgroud)
当不可解析的字符串出现异常时,上面的代码会中断.但是说我只想用默认值替换它,就像我可以用Optional:
Stream.of(s1, s2).forEach(s ->
System.out.println(Optional.of(s)
.map(Integer::parseInt)
.orElse(-1)));
Run Code Online (Sandbox Code Playgroud)
当然,这仍然失败因为Optional只处理nulls.我想要的东西如下:
Stream.of(s1, s2).forEach(s ->
System.out.println(
Exceptional.of(s)
.map(Integer::parseInt)
.handle(NumberFormatException.class, swallow())
.orElse(-1)));
Run Code Online (Sandbox Code Playgroud)
注意:这是一个自我回答的问题.
鉴于我基本上想要消除已检查的异常使用并将它们转换为运行时异常,我通常会做这样的事情:
try {
file.read();
} catch (IOException e){
throw new RuntimeException(e);
}
Run Code Online (Sandbox Code Playgroud)
这样做有几个缺点,但最让我恼火的是我的运行时异常将包含嵌套的堆栈跟踪.基本上我想将"IOException"作为RuntimeException(或"IORuntimeException")重新抛出原始消息和stacktrace,这样我就可以避免无用的嵌套堆栈跟踪.我在中间某处重新抛出异常的"事实"对我来说似乎只是无用的噪音.
这可能吗 ?有没有这样做的图书馆?