Kotlin学习之路(4)函数的运用

Kotlin学习之路(4)函数的运用

今天的学习目录
在这里插入图片描述

【函数的基本用法】

Kotlin声明方式
先跟Java的声明方式对比一下,从onCreate方法入手看看他们的不同

//Java 声明方式
  @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
   .....}
//Kotlin 声明方式
 override fun onCreate(savedInstanceState: Bundle?) {
   ......}

通过两者的对比,咱们可以发现
① Java使用@Override表示该函数重载父类的方法,而Kotlin使用小写的override 在同一行表达重载操作
② Java 使用 protected / public 表示该函数为公共方法,而Kotlin默认就表示函数是公开的,所以省略了关键字
③ Java使用 void表示该函数没有返回值,而Kotlin中没有关键字void ,若没有返回值不用特别声明
④ Kotlin 新增了关键字 fun,这个fun类似Java中 关键字class
⑤ Java声明输入参数格式 “变量 变量名称”而Kotlin 前面说过参数的命名 “变量名称:变量类型”
⑥ Kotlin 中引用了空安全机制,允许某个变量为空,就需要在变量类型后面加个“?”

【输入输出参数的变化】

输入参数的格式

举几个例子

   //没有输入也没有输出函数
    fun getDinner(){
   
        tv_text.text = "动物园"
    }
  //只有输入参数
    fun getDinnerInput(egg:Int,leek:Double,water:String){
   
        tv_text.text = water
    }

输出参数的格式

举个栗子

  //Unit类型表示表示没有返回值 也可以直接省略Unit声明
    fun getDinnerUnit():Unit{
   
        tv_text.text = "哦哦"
    }
    //只有输出参数
    fun getDinnerOutput():String{
   
        var dinner:String = "奥利给!"
        return dinner
    }
   //同时具备输入输出
    fun getDinnerFull(egg: Int,water: String):String{
   
        return water
    }

默认参数

Kotlin 可以带有默认参数

 fun getDefault(general: String, first: String = "快", two: String = "准狠"): String {
   

        var answer: String = "$general:$first,$two"

        return  answer
    }

可变参数

默认参数的命名告一段落,如果函数定义里面的参数可变,这该怎么办呢?在Java体系中,可变参数可以采用“Object…args”的形式。但是在Kotlin中新增了关键字vararg,表示其后面的参数个数不确定。
以可变的字符串为例 Java写法“String…args”,而Kotlin中的写法“vararg args:Sting?”,函数内部解析的时候,Kotlin会把可变参数当成一个数组。

【几种特殊的函数】

泛型函数
按照之前的例子,函数的输入参数类型必须定义函数的时候需要指定
例如:var int_array:Array<Int> = arrayOf<Int>(1,2,3)
定义泛型函数的时候,得在函数名称前面添加,以T声明的参数 包括输入输出参数,参数必须在函数调用时指定。

   fun <T> appendString(tag: String, vararg otherInfo: T?): String {
   
        var str: String = "$tag:"
        for (item in otherInfo) {
   
            str = "$str${
     item.toString()}"
        }
        return str
    }

调用appendString函数,就跟调用arrayOf方法一样,只需在函数名称后面加<变量类型>即可

内联函数
前面我们定义的泛型函数appendString时,是把它作为一个全局函数,也就是在类外定义,而不是在类内部定义。因为类的成员依赖于类,只有泛型类才能拥有成员泛型函数,而普通类是不允许定义泛型函数的,否则编译器直接报错。 不过也有例外当参数类都是继承于某种类型,那么允许在定义函数时指定从这个基类泛化开,凡是继承自该基类子类,都可以作为输入参数进行调用,反之无法调用!
举个栗子,Int Float Double 都继承自Number类,但是假如定义一个参数形式为setArrayNumber(array:Array<Number>)的函数,它并不接受Array<Int>或者Array<Double>的入参。如果要让该方法同事接收整型和双精度的数组入参,那就得使用泛型T 来自于基类Number 将< T >改为< reified T: Number>,同时在fun前面加上关键字inline,表示该函数属于内联函数。

   //该函数不接收Array<Int>也不接收Array<Double>
    fun setArrayNumber(array: Array<Number>) {
   
        var str: String = "数组元素依次排列"
        for (item in array) {
   
            str = str + item.toString() + ","
        }
    }

    //只有内联函数才能可以被具体化
    inline fun <reified T : Number> setArratStr(array: Array<T>) {
   
        var str: String = "数组元素依次排列"
        for (item in array){
   
            str = str + item.toString() + ","
        }
    }

小结

通过这次学习应该要掌握的技能
(1) 学会定义一个包括输入参数 输出参数在内的完整函数形态
(2) 学会输入参数的几种定义,默认参数 名命参数
(3) 学会几种函数定义以及使用

[希望这篇文章可以帮到你]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/2825.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • mysql workbench如何导入数据库_sql数据库脚本导入

    mysql workbench如何导入数据库_sql数据库脚本导入首先,打开MySQLworkbench,先新建数据库(我们会把.sql文件导入之这个数据库),新建数据库过程如下:先点击1处,新建数据库,给数据库起个名字,点击appy,就创建成功了。之后点击2处,就可以看到现有的数据库了。这里圈出来的是我新建的数据库,双击选中这个数据库(双击选中很重要,因为选中之后才能将.sql文件导入这个数据库中)。然后点击左上方的第二个图标(图中圈出来的那…

  • 替换指定字符串中,键对应的键值

    替换指定字符串中,键对应的键值

  • k8s pod调度_调度方式

    k8s pod调度_调度方式k8s概述定向调度亲和性调度污点和容忍Pod的调度概述在默认情况下,一个Pod在哪个Node节点上运行,是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的。但是在实际使用中,这并不满足需求,因为很多情况下,我们想控制某些Pod到达某些节点上,那么应该怎么做?这就要求了解kubernetes对Pod的调度规则,kubernetes提供了四大类调度方式。自动调度:运行在哪个Node节点上完全由Scheduler经过一系列的算法计算得出。定向调度:NodeName、NodeS

  • 宏基因组数据分析:差异分析(LEfSe安装使用及LDA score计算)

    宏基因组数据分析:差异分析(LEfSe安装使用及LDA score计算)文章目录简介安装简介安装报错:Collectingpackagemetadata(current_repodata.json):doneSolvingenvironment:failedwithinitialfrozensolve.Retryingwithflexiblesolve.Solvingenvironment:failedwithrepodatafromcurrent_repodata.json,willretrywithnextre

  • 浅谈Android指纹识别技术[通俗易懂]

    浅谈Android指纹识别技术[通俗易懂]浅谈Android指纹识别技术当今时代,随着移动智能手机的普及,指纹解锁早已是手机不可或缺的一个功能。除了现在比较新款的iPhone或者部分手机采用了FaceID之外,人们几乎天天都会用到指纹解锁技术。但你知道指纹解锁技术背后的原理吗?原理指纹识别的前提是对指纹的采集,所以我们首先就应该了解第一步:指纹采集。第一步:指纹采集指纹采集主要分为两种方式:滑动式采集和按压式采集滑动式采集是将手指在传感器上滑过,从而使手机获得手指指纹图像。滑动式采集具有成本相对偏低,而且可以采集大面积图像的优势。但这

  • Json交互处理_stata交互项检验

    Json交互处理_stata交互项检验Json交互处理JSON简介JSON(JavaScriptObjectNotation,JS对象标记)是一种轻量级的数据交换格式,目前使用特别广泛。采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。在JavaScript语言中,一切都是对象。因此,任何JavaScript支持的类型都可以通过JSON来表示,例如字符串、数字、对象、数组等。看看他

    2022年10月15日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号