悩んだこと
hogeSupplier.get(() -> {
try {
fugafuga();
} catch(Exception e) {
// Runtimeで投げる?何もしない?
// 【問題】考えたり定義するのがメンドクサーーーーーーーイ
}
});
原因
- 原因はラムダ式ではなく、Java8 時点の
Supplier
がthrows Exception
になっていないから。 -
<ラムダ式は検査例外扱えない~!
- とか勘違いしていた。
- あくまでもFunctionalInterfaceのシグニチャの問題だった。
解決した方法
- ならば
throws Exception
なSupplier
を作ればいいじゃないのよ。
ThrowableSupplier.java
@FunctionalInterface
public interface ThrowableSupplier<T> {
T get() throws Exception;
}
-
これを
ThrowableSupplier<String> s = () -> getString(xxx);
のように使えばOK。 -
今回は Supplier だけれども、Consumer、BiConsumer、Function、Predicate などなど... でも同様の捉え方でよしなにできますね。
ひとこと
- 標準APIにあるものを そのまま使って なんとかしなきゃ!という固定観念。こわいなー。
クールな解決法
- Java8のラムダ式やStream APIでクールに例外を扱う が参考になります。