1. ホーム

[解決済み】Java 8 Lambda関数が例外を投げる?

2022-04-16 09:09:02

質問

を持つメソッドへの参照を作成する方法は知っています。 String パラメータを返し int であれば、それは

Function<String, Integer>

しかし、これは関数が例外を投げる場合、例えば次のように定義されているとすると、うまくいきません。

Integer myMethod(String s) throws IOException

このリファレンスをどのように定義すればよいのでしょうか?

どのように解決するのですか?

以下のいずれかを行う必要があります。

  • 自分のコードであれば、チェックした例外を宣言する独自の関数インターフェイスを定義します。

    @FunctionalInterface
    public interface CheckedFunction<T, R> {
       R apply(T t) throws IOException;
    }
    
    

    を作成し、それを使用します。

    void foo (CheckedFunction f) { ... }
    
    
  • それ以外の場合は、ラップ Integer myMethod(String s) を、チェックした例外を宣言していないメソッドで実行します。

    public Integer myWrappedMethod(String s) {
        try {
            return myMethod(s);
        }
        catch(IOException e) {
            throw new UncheckedIOException(e);
        }
    }
    
    

    といった具合に。

    Function<String, Integer> f = (String t) -> myWrappedMethod(t);
    
    

    または

    Function<String, Integer> f =
        (String t) -> {
            try {
               return myMethod(t);
            }
            catch(IOException e) {
                throw new UncheckedIOException(e);
            }
        };