
164
|
第
10
章
block: (Sequence<String>) -> T): T =
buffered().use { block(it.lineSequence()) }
请注意,该实现会创建一个 BufferedReader 实 例 (由 buffered 函数返回),并将
其委托给 use 函数。
示例 10-4 给出了 use 函数的相应签名。
示例 10-4:Closeable 上的 use 扩展函数
inline fun <T : Closeable?, R> T.use(block: (T) -> R): R
由于需要进行异常处理,因此实现起来很复杂,但从根本上讲,它类似这样:
try {
return block(this)
} catch (e: Throwable) {
// 将异常保存并稍后使用
throw e
} finally {
close() // 需要额外的 try/catch 语句
}
use 块是 Execute Around Method 设计模式的一个示例,该基础结构代码已内置到库中,
一个提供的 lambda 表达式用于完成实际工作。这种基础架构与业务逻辑的分离使开发
者更容易专注于手头的任务。
本节中的 use 函数定义在 Java 6 中可用的 Closeable 接口上。如果你要求
底层的 JDK 支持 Java 8,Kotlin 在 AutoCloseable 上也定义了相同的函数。
参阅
10.2 节说明了如何直接使用 use 函数编写代码。在 ...