美文网首页
2.3.3 函数的类型

2.3.3 函数的类型

作者: AndYMJ | 来源:发表于2021-07-04 22:31 被阅读0次

    在Kotlin中,函数类型的格式非常简单,举个例子:

    (Int)->Unit

    从中我们发现,kotlin中的函数类型声明需遵循以下几点:

    1.通过->符号来组织参数类型和返回值类型,左边是参数类型,右边是返回值类型;

    2.必须用一个括号来包裹参数类型;

    3.返回值类型即时是Unit,也必须显式声明。

    如果是一个没有参数的函数类型,参数类型部分就用()来表示。

    ()->Unit

    如果是多个参数的情况,那么我们就需要用逗号来进行分隔,如:

    (Int,String) ->Unit

    此外,kotlin还支持为声明参数指定名字,如下所示:

    (errCode:Int,errMsg:String)->Unit

    如果该函数类型的变量也是可选的话,我们还可以把整个函数类型变成可选:

    ((errCode :Int ,errMsg:String?)->Unit)?

    这种组合是不是非常有意思?还没完,我们说过,高阶函数还支持返回另一个函数,所以还可以这么做

    (Int)->((Int)->Unit)

    这表示传入一个类行为int的函数,然后返回另一个类型为(Int)->Unit的函数。简化它的表达,我们可以把后半部分的括号给省略:

    (Int)->Int->Unit

    需要注意的是,以下的函数类型则不同,它表示的传入一个函数类型的参数,再返回一个Unit。

    ((Int)->Int)->Unit

    好了,,在学习了Kotlin函数类型知识之后,Shaw便重新定义了filterCountries方法的参数声明。

    那么问题来了。我们如何才能把代码清单2-1中的isBigEuropeanCountry方法传递给filterCountries啦?直接把isBigEuropeanCountry当参数可定不行,因为函数名并不是一个表达式,不具有类型信息,它在带上括号、被执行后才存在值。可以看出,我们需要的是一个单纯的 方法引用表达式,用它在filterCountries内部来调用参数。下一节我们会具体介绍如何使用这种语法。

    2.3.4 方法和成员引用

    kotkin存在一种特殊的语法,通过两个冒号来实现对于某个类的方法进行引用。以上面的代码为例,假如我们有一个CountryTest类的对象实例countryTest,如果要引用它的isBigEuropeanCountry方法,就可以这么写:countryTest::isBigEuropeanCountry

    ------------------

    为什么使用双冒号的语法?

    如果你了解C#,会知道他也有类似的方法引用特性,只是语法上不同,是通过点号实现的。然而,C#的这种方式存在二义性,容易让人混淆方法引用表达式与成员表达式,所以Kotlin采用::(沿袭了Java 8 的习惯),能够让我们更加清晰的认识这种语法。

    -----------------

    此外,我们还可以直接通过这种语法,来定义一个类的构造方法引用变量。

    可以发现,getBook的类型为(name:String)->Book 。类似的道理,如果我们要引用某个类中的成员变量,如Book类中的name,就可以这样引用

    Book::name

    以上创建的Book::name的类型为(Book)->String。当我们在对Book类对象的集合应用一些函数式API的时候,这会显得格外有用,比如:

    我们会在6.2节再次提到这种应用。于是,Shaw便使用了方法引用来传递参数,以下的调用果真奏效了。

    经过重构后的程序显然比之前要优雅许多,程序可以根据任意的筛选需求,调用同一个filterCountries方法来获取国家数据。


    相关文章

      网友评论

          本文标题:2.3.3 函数的类型

          本文链接:https://www.haomeiwen.com/subject/galvultx.html