Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何有效地阅读/解释此Kotlin代码?_Kotlin - Fatal编程技术网

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

如何有效地阅读/解释此Kotlin代码?,kotlin,Kotlin,我知道如何阅读/解释Java代码,并且我可以编写它。然而,作为kotlin的新手,我发现下面这样的代码很难阅读。也许我缺少语言中的关键概念 但是,您将如何解释此代码?为了快速有效地理解这段代码,您建议从哪里开始阅读?从左到右?从右到左?先分解参数?看看返回值 inline fun <T : Any, R> ifNotNull(input: T?, callback: (T) -> R): R? { return input?.let(callback) } 所以,像J

我知道如何阅读/解释Java代码,并且我可以编写它。然而,作为kotlin的新手,我发现下面这样的代码很难阅读。也许我缺少语言中的关键概念

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

inline fun <T : Any, R> ifNotNull(input: T?, callback: (T) -> R): R? {
    return input?.let(callback)
}

所以,像Java一样,这是一个通用函数。它有两个类型参数T,类型为'Any','Any'类似于Java和R中的'Object'。输入参数是一个可为null的T,如问号所示。可为null的类型意味着该值可以为null。另一个函数参数是一个函数,它接受T不可为null的类型并返回R。该函数的返回类型是可为null的R。函数体表示,如果输入不为null,则调用并将其传递给回调函数并返回该值。如果输入为null,则返回null

与Java一样,这是一个通用函数。它有两个类型参数T,类型为'Any','Any'类似于Java和R中的'Object'。输入参数是一个可为null的T,如问号所示。可为null的类型意味着该值可以为null。另一个函数参数是一个函数,它接受T不可为null的类型并返回R。该函数的返回类型是可为null的R。函数体表示,如果输入不为null,则调用并将其传递给回调函数并返回该值。如果输入为null,则返回null

马特的回答一下子解释了一切;我将尝试看看您如何阅读这些代码

现在跳过第一个词,最重要的是第二个词:乐趣。因此,整个过程就是定义一个函数。这告诉你对其他函数的期望

大括号告诉您它是一个块函数,而不是一个单行程序,因此您期望的基本结构是:fun nameparams:returnType{code}。其余的是填充空格!这符合Kotlin声明的一般模式,其中类型排在冒号之后,排在第二位

与Java一样,尖括号中的内容提供了泛型参数,因此我们现在可以跳过它,直接转到下一个最重要的位,即所定义函数的名称:ifNotNull

有了这些,我们可以阅读其余部分。inline是一个简单的修饰符,告诉您函数将由编译器内联。这启用了一些功能,限制了一些其他功能,但我现在不担心这一点

给出函数使用的泛型参数类型。第一个是T,它必须是Any或子类型;第二个是R,它是不受限制的

Any类似于Java的对象,但不能为null;最顶层的类型是相关的Any?,它也允许null。因此,除了可空性之外,这与Java是等效的

接下来,我们在括号中有函数参数。同样,有两个:第一个称为输入,类型为T?,这意味着它接受类型为T的任何值,也接受null。第二个参数称为回调,类型更复杂,T->R:它是一个以T为参数的函数,并返回一个R。Java没有这样的函数类型,所以这看起来可能是最奇怪的。Java最接近的等价物是函数

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

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

虽然这是一个简短的声明,但它非常抽象,包含了很多内容,所以难怪您会觉得很难!该格式类似于Java方法声明-但Kotlin的表达能力非常强,因此等效代码往往比Java短一些。泛型使其更加复杂。如果您刚刚开始学习Kotlin,我建议您做一些更简单的事情:-


好消息是,就像在Java中一样,您不需要经常阅读stdlib代码。尽管Kotlin的文档注释很少达到Java的示范水平,但它们通常已经足够了。

Matt的回答一次就很好地解释了所有问题;我将尝试看看您如何阅读这些代码

现在跳过第一个词,最重要的是第二个词:乐趣。因此,整个过程就是定义一个函数。这告诉你对其他函数的期望

大括号告诉你这是一个块函数,n 这是一个单行程序,所以您期望的基本结构是:fun nameparams:returnType{code}。其余的是填充空格!这符合Kotlin声明的一般模式,其中类型排在冒号之后,排在第二位

与Java一样,尖括号中的内容提供了泛型参数,因此我们现在可以跳过它,直接转到下一个最重要的位,即所定义函数的名称:ifNotNull

有了这些,我们可以阅读其余部分。inline是一个简单的修饰符,告诉您函数将由编译器内联。这启用了一些功能,限制了一些其他功能,但我现在不担心这一点

给出函数使用的泛型参数类型。第一个是T,它必须是Any或子类型;第二个是R,它是不受限制的

Any类似于Java的对象,但不能为null;最顶层的类型是相关的Any?,它也允许null。因此,除了可空性之外,这与Java是等效的

接下来,我们在括号中有函数参数。同样,有两个:第一个称为输入,类型为T?,这意味着它接受类型为T的任何值,也接受null。第二个参数称为回调,类型更复杂,T->R:它是一个以T为参数的函数,并返回一个R。Java没有这样的函数类型,所以这看起来可能是最奇怪的。Java最接近的等价物是函数

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

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

虽然这是一个简短的声明,但它非常抽象,包含了很多内容,所以难怪您会觉得很难!该格式类似于Java方法声明-但Kotlin的表达能力非常强,因此等效代码往往比Java短一些。泛型使其更加复杂。如果您刚刚开始学习Kotlin,我建议您做一些更简单的事情:-


好消息是,与Java一样,您不需要经常阅读stdlib代码。尽管Kotlin的文档注释很少达到Java的示范级别,但它们通常已经足够了。

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

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

乐趣:我们正在定义一个函数

:函数采用两个泛型类型参数T和R。T类型仅限于Kotlin对象类型的任意类型。这似乎是多余的,但它实际上说的是T不能是可为null的类型

ifNotNull:函数的名称

输入:T?:类型为T?的第一个参数?。我们可以把它放在哪里?因为我们在类型声明中将它限制为不可为null的类型

回调:T->R:第二个参数的类型是T->R,这是一个函数类型。它是一种以T作为输入并返回R的函数类型

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

返回输入?.letcallback:函数体。let函数接受一个函数参数,使用其接收器输入调用它,然后返回函数的结果。这个输入后表示只有在输入不为null时才会调用let。如果输入为null,则表达式将返回null

除了内联类型和可空类型外,该函数与此Java方法等效:

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

    return callback.apply(input);
}

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

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

乐趣:我们正在定义一个函数

:函数采用两个泛型类型参数T和R。T类型仅限于Kotlin对象类型的任意类型。这似乎是多余的,但它实际上说的是T不能是可为null的类型

ifNotNull:函数的名称

输入:T?:类型为T?的第一个参数?。我们可以把它放在哪里?因为我们在类型声明中将它限制为不可为null的类型

回调:T->R:第二个参数的类型是T->R,这是一个函数类型。它是一种以T作为输入并返回R的函数类型

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

返回输入?.letcallback:函数体。let函数接受一个函数参数,用它的接收器输入调用它, 然后返回函数的结果。这个输入后表示只有在输入不为null时才会调用let。如果输入为null,则表达式将返回null

除了内联类型和可空类型外,该函数与此Java方法等效:

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

    return callback.apply(input);
}

T不是任何类型,它是任何类型的子类型。这增加了价值,但我需要一个更全面的答案。但从你的回答来看,我的问题似乎很清楚,所以我非常感谢你的投票!T不是任何类型,它是任何类型的子类型。这增加了价值,但我需要一个更全面的答案。但从你的回答来看,我的问题似乎很清楚,所以我非常感谢你的投票!这也增加了价值,但我需要更多的包装文本,如gidds A。如果你发现我的Q清晰,我会非常感谢向上投票。这也增加了价值,但我需要更多的包装文本,如gidds A。如果你发现我的Q清晰,我会非常感谢向上投票。这就是我们正在寻找的。从答案来看,我的问题似乎很清楚,所以我真的很感激投票!这就是我们要找的。从答案来看,我的问题似乎很清楚,所以我真的很感激投票!