代码之家  ›  专栏  ›  技术社区  ›  thelastchief

如何有效地读取/解释此Kotlin代码?

  •  1
  • thelastchief  · 技术社区  · 6 年前

    我知道如何阅读/解释Java代码,我可以编写它。然而,作为一个新的科特林,我发现下面的代码很难阅读。也许我遗漏了语言中的关键概念。

    但是,如何解释这段代码呢?为了快速有效地理解这段代码,您建议从哪里开始阅读?从左到右?从右到左?先分解参数?看看返回值?

    inline fun <T : Any, R> ifNotNull(input: T?, callback: (T) -> R): R? {
        return input?.let(callback)
    }
    
    3 回复  |  直到 6 年前
        1
  •  2
  •   gidds    6 年前

    马特的回答很好地解释了一切,我会尽力去看看 怎样 你可以去读这样的代码。

    现在跳过第一个词,最重要的是第二个词: fun 如此 整个事情就是定义一个函数 这告诉你对其他人的期望。

    大括号告诉您它是一个块函数,而不是一个线性函数,因此您期望的基本结构是: fun name(params): returnType { code } 其余的都是填空的!这符合Kotlin声明的一般模式,其中类型是第二个,在冒号之后。 returnType name(params) { code } )

    与Java一样,角括号中的东西提供通用参数,所以我们现在可以跳过,直接转到下一个最重要的位,即 正在定义的函数的名称 : ifNotNull .

    有了这些,我们就可以读其他的了。 inline 是简单的 修饰语 ,告诉您函数将由编译器内联。

    这个 <T : Any, R> 给出 通用参数类型 函数使用的。第一个是 T ,一定是 Any 或子类型;第二个是 R ,这是不受限制的。

    ( 任何 就像Java的 Object 但不能 null ;最上面的类型是相关的 Any? ,也允许 无效的 所以,除了可空性之外,这相当于Java。 <T extends Object, R> )

    继续,我们有 功能参数 括号里还有两个:第一个叫做 input ,它的类型是 T? ,这意味着它接受任何类型的值 T ,也接受 无效的 .调用第二个参数 callback 有一个更复杂的类型, (T) -> R :它是一个函数,需要 T 作为其参数,并返回 R .*(Java没有这样的函数类型,所以看起来可能是最奇怪的。 Function<R, T> )

    括号后面是 返回类型 这个函数本身, R? ,这意味着它可以返回 R 无效的 .

    最后,大括号中是实际的 代码 函数的一行,返回表达式的值。 输入 无效的 :如果是,则返回 无效的 直接。否则,它会调用 回调 参数中给定的函数,传递 输入 作为其参数,并返回其结果。)

    虽然这是一个简短的声明,但它非常抽象,包含了很多内容,所以难怪你发现这很难做到!{(格式类似于Java方法声明Kotlin),但其相当有表现力,所以等效代码往往比Java短一些。而泛型使它更复杂。)如果你刚刚开始学习Kotlin,我会建议更容易一些的东西:

    (好消息是,和Java一样,你不需要经常读取STDLIB代码。)虽然Kotlin的DOC注释很少达到Java的示例级别,但它们通常还是足够的。

        2
  •  4
  •   Matt Berteaux    6 年前

    所以,像Java一样,这是一个通用的函数。它有两个类型参数T,它的类型是“任何”(“任何”都像Java中的“对象”)和R。输入参数是一个空的T,由问号表示。可以为空的类型意味着该值可以为空。另一个函数参数是接受t(不可为空的类型)并返回r的函数。函数的返回类型是可为空的r。函数体表示,如果输入不为空,则调用并将其传递给回调并返回该值。如果输入为空,则返回的值为空。

        3
  •  3
  •   marstran    6 年前

    让我们逐个剖析函数定义:

    inline :表示函数的代码将直接复制到调用站点,而不是像普通函数一样被调用。

    fun :我们正在定义一个函数。

    <T : Any, R> :函数接受两个泛型类型参数, T R . 这个 T 类型仅限于 Any 类型(Kotlin's Object -类型)。这似乎是多余的,但它实际上说的是 T 不能是可以为空的类型( Any? )

    ifNotNull :函数的名称。

    input: T? :类型的第一个参数 T? . 我们可以把 ? T 在此处键入,因为我们在类型声明中将其限制为不可为空的类型。

    callback: (T) -> R :第二个参数的类型为 (T) -> R ,这是一个函数类型。它是一个函数的类型, T 作为输入并返回 R .

    : R? :函数返回类型的值 R 或为空。

    return input?.let(callback) :函数体。这个 let 函数接受一个函数参数,用它的接收器调用它( input ,然后返回函数的结果。这个 ? 之后 输入 只有在 输入 不是空的。如果 输入 为空,则表达式将返回空。

    该函数相当于此Java方法(除了内联和可空类型):

    public <T, R> R ifNotNull(final T input, final Function<T, R> callback) {
        if (input == null) {
            return null;
        }
    
        return callback.apply(input);
    }