日々常々

ふつうのプログラマがあたりまえにしたいこと。

ラムダさんのコレクション以外の使い道

なるほど、確かに AutoCloseable は Functional Interface だ。

public interface AutoCloseable {
    void close() throws Exception;
}

なので Lambda が使える!

try (AutoCloseable ac = () -> {}) {
}

やたーコンパイル通ったー。*1


……ここからの発展が思いつかない。とりあえず実行される順番でも確認しとく?

try (AutoCloseable ac = () -> { System.out.println("close!"); }) {
    System.out.println("try!");
    throw new Exception();
} catch (Exception e) {
    System.out.println("catch!");
} finally {
    System.out.println("finally!");
}

ほい。

try!
close!
catch!
finally!

だからどうした(´・ω・`)


あ、try-with-resources を使わない話か……。

追記

なるほど、ローンパターン。

reader("input.txt", in -> {
    // ファイルを使う処理
});

どうしてもScalaのようなカリー化もできないし、Groovyのように引数の最後がクロージャだったら外に出せるわけでもないので、どうしても制御構造ぽく見せることは出来ないけど、出来なくはない。表現力の幅は広がるかな。

*1:書き方は Lambdaの書き方をさくっと - 日々常々 を参照のこと。