Javaのチェックされた例外は、Cのエラー処理メカニズムに比べて大きな改善でした。時間が経つと経験が積み重ねられ、我々は、我々がまだそこにいないと集合的に結論づけました。 Java 8 は「チェックされた例外は素晴らしい」というトレンドの後で lambdas を導入しました。機能インターフェイス方法のいずれもチェックされた例外を受け入れることはできません。 問題は、コードの中。 単純な例外投げ方を考えてみましょう。 public class Foo { public String throwing(String input) throws IOException { return input; //1 } } 体はコンパイル目的のために存在するが、その正確な内容は無関係である。 この方法はA 返す A それはAの形を持っている。 だから、そのように使えます: String String Function<I, O> var foo = new Foo(); List.of("One", "Two").stream() .map(string -> foo.throwing(string)) .toList(); 上記のコードはコンパイルエラーで失敗します: unreported exception IOException; must be caught or declared to be thrown .map(string -> foo.throwing(string)).toList(); ^ 1 error エラーを修正するには、トライ・キャッチ・ブロックに投げるコードを包む必要があります。 List.of("One", "Two").stream() .map(string -> { try { return foo.throwing(string); } catch (IOException e) { return ""; } }).toList(); この時点で、コードはコピーするが、Lambdasの主な目的を打ち負かす:簡潔で可読である。 より良いアプローチ 私たちは確実にAをモデリングすることによってデザインを改善することができます。 投げることで . Function apply() interface ThrowingFunction<I, O, E extends Exception> { O apply(I i) throws E; } その後、このような投げ方を変えるための包装を提供することができます。 A regular へ . Function Function class LambdaUtils { public static <I, O, E extends Exception> Function<I, O> safeApply(ThrowingFunction<I, O, E> f) { return input -> { try { return f.apply(input); } catch (Exception e) { return ""; } }; } } 上記の場合、コードは以下のように改善できます。 var foo = new Foo(); List.of("One", "Two").stream() .map(string -> LambdaUtils.safeApply(foo::throwing)) //1 .toList(); コード再び 図書館を救出。 Lambda で例外投げコードを呼び出す最も簡単な方法は、ライブラリを使用することです. Two libraries that I know of provide this capability: Apache Commons Lang 3 ワールド 以下は、上記のコードを Commons Lang 3 コードを使用して書き換える方法です。 var foo = new Foo(); FailableFunction<String, String, IOException> throwingFunction = foo::throwing; //1 List.of("One", "Two").stream() .map(throwingFunction) .recover(e -> "") //2 .toList(); Commons Lang 3 モデル a throwing Function recover() は、前の catch ブロックの値を模します。 図書館は上記の議論の余地のあるデザインで改善されていますが、アイデアは同じです。 独自のライブラリをリリースするか、ライブラリを使用するかの決定は、この投稿を超えるさまざまな要因に依存します。 あなたを助けるために いくつかの基準 チェックされた例外の削除 チェックされた例外はコンパイルタイムの問題です Java Language Specification は次のように述べています。 Java プログラミング言語のコンパイラは、コンパイラの時点で、プログラムにチェックされた例外の取り扱いが含まれていることを検証し、どのチェックされた例外がメソッドまたはコンパイラの実行から生じるかを分析します。 すべてのチェックされた例外が可能な結果である場合、方法の投下条項(§8.4.6)またはコンパイラ(§8.8.5)は、その例外のクラスのクラスまたはその例外のクラスのスの一つを言及しなければなりません。 11.2 Compile-Time Checking of Exceptions (例外のコピータイムチェック) Java プログラミング言語のコンパイラは、コンパイル時点で、プログラムにハンドラーが含まれていることを確認します。 , by analyzing which checked exceptions can result from execution of a method or constructor. For each checked exception which is a possible result, the 方法(§8.4.6)または構築者(§8.8.5)の条項は、その例外のクラスまたはその例外のクラスのスーパークラスのいずれかを言及しなければならない。 例外チェック throws 11.2 Compile-Time Checking of Exceptions (例外のコピータイムチェック) 私たちはコンパイラに潜在的に接続して、コンパイラプラグインを介してこのチェックを防ぐことができます。 ManifoldはJavaコンパイラプラグインで、非常に生産的な機能でJavaプロジェクトを補完するために使用します。 強力な言語強化により、開発者の生産性が向上します。 拡張方法 真の代表団 財産 オプションパラメータ(新規!) 二重表現 Operator overloading ユニット表現 A Java template engine A preprocessor ...and more ・Manifoldとは ManifoldはJavaコンパイラプラグインで、非常に生産的な機能でJavaプロジェクトを補完するために使用します。 強力な言語強化により、開発者の生産性が向上します。 拡張方法 真の代表団 財産 オプションパラメータ(新規!) 二重表現 オペレーターOverloading ユニット表現 Java Template エンジン 1 プロセッサ ...そしてもっと ・Manifoldとは Disclaimer: 私はManifoldを使用することを支持しません. それはあなたがJavaと働く言語を異なります. この時点で、あなたは直接Kotlinを使用する方が良いでしょう. チェックされた例外を抑制するために Manifold を使用することは、2 段階のプロセスです. First, we add the Manifold runtime to the project: <dependency> <groupId>systems.manifold</groupId> <artifactId>manifold-rt</artifactId> <version>${manifold.version}</version> <scope>provided</scope> </dependency> 次に、コンパイラプラグインを構成します。 <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <source>11</source> <target>11</target> <encoding>UTF-8</encoding> <compilerArgs> <arg>-Xplugin:Manifold</arg> </compilerArgs> <annotationProcessorPaths> <path> <groupId>systems.manifold</groupId> <artifactId>manifold-exceptions</artifactId> <version>${manifold.version}</version> </path> </annotationProcessorPaths> </configuration> </plugin> </plugins> </build> この時点で、チェックされた例外を未チェックとして扱うことができます。 var foo = new Foo(); List.of("One", "Two").stream() .map(string -> foo.throwing(string)) //1 .toList(); コンパイル 無問題 結論 この投稿では、私はJavaでLambdasとチェックされた例外を統合する問題に取り組んできました. I listed several options: the try-catch block, the throwing function, the library, and Manifold. I hope you can find one that suits your context among them. 私は、いくつかのオプションをリストしました。 To go further: Apache Commons Lang 3 ワールド Java Lambda Expressions の例外 Vavr を使用する Lambda 表現の例外 チェックされた例外に別れを告げる Java's Checked Exceptions を修正する オリジナルの投稿 A Java Geek on 2026年1月18日 ・Java Geek