TL; DR:特別な構文はなく、関数のみ
Javaとは対照的に、Kotlinにはこのための特別な構文はありません。代わりに、try-with-resourcesが標準ライブラリ関数として提供されていますuse。
FileInputStream("filename").use { fis -> //or implicit `it`
//use stream here
}
use実装
@InlineOnly
public inline fun <T : Closeable?, R> T.use(block: (T) -> R): R {
var closed = false
try {
return block(this)
} catch (e: Exception) {
closed = true
try {
this?.close()
} catch (closeException: Exception) {
}
throw e
} finally {
if (!closed) {
this?.close()
}
}
}
この関数は、すべてのCloseable?タイプの一般的な拡張として定義されています。Java SE7の時点でリソースを試すことができるCloseableJavaのインターフェースです。
この関数は、で実行される関数リテラルを取ります。同じのtry-と資源 Javaで、取得し閉じで。
blocktryCloseablefinally
また、内部で発生した障害は実行にblockつながりclose、可能な例外は無視するだけで文字通り「抑制」されます。このような例外はJavaのソリューションで要求できるため、これはtry-with-resourcesとは異なります。
どうやって使うのですか
use拡張子は、任意の上で利用可能であるCloseable読者とそうで、すなわちストリーム、タイプ。
FileInputStream("filename").use {
//use your stream by referring to `it` or explicitly give a name.
}
中括弧で囲まれた部分が何になるかblockですuse(ここでは引数としてラムダが渡されます)。ブロックが完了したら、それがFileInputStream閉じられていることを確認できます。