Answers:
有use
功能全在科特林STDLIB(SRC)。
如何使用它:
OutputStreamWriter(r.getOutputStream()).use {
// by `it` value you can get your OutputStreamWriter
it.write('a')
}
OutputStreamWriter
:r.outputStream.writer.use { ... }
use
扩展的参考文档:kotlinlang.org/docs/reference/…–
FileOutputStream(into).use { val mergingStream = BufferedOutputStream(it).use { } }
与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?
类型的通用扩展。Closeable
是Java的接口,允许从Java SE7开始使用try-with-resources。
该函数采用一个函数文字,该文字在中执行。同与尝试,以资源在Java中,被关闭的。block
try
Closeable
finally
内部发生的故障block
也会导致close
执行,在这种情况下,只要忽略它们,就可以“抑制”可能的异常。这与try-with-resources不同,因为可以在Java解决方案中请求此类异常。
该use
扩展适用于任何Closeable
类型,即流,阅读器等。
FileInputStream("filename").use {
//use your stream by referring to `it` or explicitly give a name.
}
大括号中的部分变成block
了use
(在这里lambda作为参数传递)。完成该块后,可以确保FileInputStream
已将其关闭。
编辑:以下响应对于Kotlin 1.0.x仍然有效。对于Kotlin 1.1,支持一个针对Java 8的标准库,以支持可关闭的资源模式。
对于其他不支持“ use”功能的类,我做了以下自制的try-with-resources:
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)
}
}
try/finally
街区
由于此StackOverflow帖子位于“ kotlin可关闭示例”当前搜索结果的顶部附近,而其他答案(也非官方文档)都没有明确说明如何扩展Closeable
(aka java.io.Closeable
),因此我想添加一个示例如何使自己的课程扩展Closeable
。它是这样的:
import java.io.Closeable
class MyServer : Closeable {
override fun close() {
println("hello world")
}
}
然后使用它:
fun main() {
val s = MyServer()
s.use {
println("begin")
}
println("end")
}
在此处的Kotlin游乐场中查看此示例。