Kotlin 中使用函数的意义何在

Posted

技术标签:

【中文标题】Kotlin 中使用函数的意义何在【英文标题】:What's the point of the use function in Kotlin 【发布时间】:2020-04-09 09:31:09 【问题描述】:

我正在尝试将内联函数 use 与 FileInputStream 一起使用,而不是经典的 try/catch IOException,以便

try 
    val is = FileInputStream(file) 
    // file handling...

catch (e: IOException) 
    e.printStackTrace()

变成

FileInputStream(file).use  fis ->
    // do stuff with file

我的问题是,如果函数use 仍然抛出异常,为什么还要使用它?我是否必须将 use 包装在 try/catch 中?这看起来很荒谬。

【问题讨论】:

文件不是托管资源,java 不知道何时释放它。它不受垃圾收集器管理。您需要正确关闭它。不管失败与否,都完成了。 use 相当于 java 7 中的 try-with-resources docs.oracle.com/javase/tutorial/essential/exceptions/… 【参考方案1】:

来自 Kotlin 文档:

在这个资源上执行给定的块函数然后关闭它 无论是否抛出异常,都正确向下。

当你使用一个实现了Closeable接口的对象时,你需要在使用完成后调用close()方法,这样它就会释放所有系统资源与对象相关联。

即使抛出异常,您也需要小心并关闭它。在这种容易出错的情况下,由于您可能不知道或忘记正确处理它,最好将这种模式自动化。这正是 use 函数所做的。

【讨论】:

【参考方案2】:

您的try-catch 没有关闭资源,因此您将苹果与橙子进行比较。如果关闭finally块中的资源:

val is = FileInputStream(file)
try 
    ...
 
catch (e: IOException) 
    ...

finally 
    is.close()

肯定比处理关闭资源的use 更详细。

【讨论】:

这更像是 try-with-resources。 try(val is = FileInputStream(file)) ... @AccessDenied 你能解释一下val is 怎么可能是空的吗?我是 Kotlin 的新手,也许我遗漏了一些东西。

以上是关于Kotlin 中使用函数的意义何在的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin函数式编程 ② ( 过滤函数 | predicate 谓词函数 | filter 过滤函数 | 合并函数 | zip 函数 | folder 函数 | 函数式编程意义 )

Kotlin函数 ⑨ ( Kotlin 语言中的闭包概念 | Java 语言中函数作为参数的替代方案 )

在 kotlin 中命名伴生对象有啥意义

android 11 kotlin 中的包可见性

Kotlin初识Kotlin之扩展函数与属性

Kotlin——高级篇:高阶函数详解与标准的高阶函数使用