【问题标题】:Difference between Let and Use function in KotlinKotlin 中 Let 和 Use 函数的区别
【发布时间】:2020-07-23 12:27:44
【问题描述】:

我浏览了 Kotlin 的“let”和“use”方法的代码示例。但是我无法弄清楚这两个代码示例之间的任何区别以及它们的用例之间的具体区别。代码示例写在下面。

//use method
    fun main(args: Array) {
    val file = File("input"+File.separator+"contents.txt")
    file.bufferedReader().use{
        println(it.readText())
    }
}

//let method.
var name : String? = "Kotlin let null check"
name?.let { println(it) }

有人可以解释这两种方法及其用例之间的区别吗?谢谢。

【问题讨论】:

  • use的文档;它的目的与let 完全不同。
  • use 用于类似目的,但在给定块完成后关闭 AutoCloseable 对象。

标签: kotlin lambda functional-programming


【解决方案1】:

他们在做非常不同的事情。

use() 用于确保即使在发生错误时也能关闭资源。它只能在实现Closeable 接口的对象上调用,并且在某种程度上相当于Java 的try-with-resources 构造,但use() 是一个简单的库函数,不需要任何新的语言语法。

在您的示例中,它确保BufferedReader 获得close()d 无论readText() 调用正常完成还是抛出IOException 或其他。 (在任何情况下都干净利落地关闭外部资源非常重要;Kotlin 让这一切变得尽可能简单。)

let()scope function(如apply()also()run()with());它可以在任何对象(甚至null)上调用,其目的是更改代码块中的上下文。在这种情况下,块内it 指的是调用let 的值,块的返回值成为let 的结果。它可用于将一系列相关的赋值转换为调用链——尤其是当中间值可能为空时,?. 安全调用运算符可以避免大量的ifs。

在您的示例中,仅当 name 不为空时才调用 println()。替代方案是:

if (name != null)
    println(name)

在这种情况下,额外的行不会长,也不必重复name;但您可以看到,在更复杂的示例中,节省的费用可能很大。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-18
    • 2020-11-07
    • 2013-09-22
    • 2013-10-04
    • 2018-12-09
    • 2011-03-25
    • 2017-01-17
    • 2021-04-21
    相关资源
    最近更新 更多