在Kotlin试用资源
当我试图在Kotlin上写一个类似try-with-resources的代码时,它并不适合我。
我尝试了以下的不同变化:
try (writer = OutputStreamWriter(r.getOutputStream())) { // ... }
但是都没有用。
有谁知道应该用什么来代替? 显然Kotlin语法没有这样的构造的定义 ,但可能是我失去了一些东西。 它为try块定义语法如下:
try : "try" block catchBlock* finallyBlock?;
在kotlin stdlib( src )中有use
功能。
如何使用它:
OutputStreamWriter(r.getOutputStream()).use { // by `it` value you can get your OutputStreamWriter it.write('a') }
编辑 :以下响应仍然适用于Kotlin 1.0.x. 对于Kotlin 1.1,支持一个标准的库,其目标是支持可关闭资源模式的Java 8。
对于不支持“使用”功能的其他类,我已经做了以下自制的试用资源:
package info.macias.kotlin inline fun <T:AutoCloseable,R> trywr(closeable: T, block: (T) -> R): R { try { return block(closeable); } finally { closeable.close() } }
那么你可以用下面的方法来使用它:
fun countEvents(sc: EventSearchCriteria?): Long { return trywr(connection.prepareStatement("SELECT COUNT(*) FROM event")) { var rs = it.executeQuery() rs.next() rs.getLong(1) } }
改用use
Kotlin对此没有特殊的语法。 相反, 试用资源是作为标准库函数use
。
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?
的通用扩展Closeable?
类型。 Java的接口是可以Closeable
的,它允许从Java SE7开始 尝试使用资源 。
该函数采取一个函数文字block
, try
执行。 与Java中的try-with-resources一样 , Closeable
在Closeable
被关闭 。
在block
失败也会导致执行的结束,在可能的情况下,异常只是被忽略而忽略。 这与尝试资源不同 ,因为可以在Java解决方案中请求这样的异常。
如何使用
use
扩展可用于任何可Closeable
类型,即流,读取器等。
FileInputStream("filename").use { //use your stream by referring to `it` or explicitly give a name. }
{}
的部分是use
block
(将lambda作为参数传递)。 块完成后,您可以确定, FileInputStream
已关闭。