IT七剑客 IT七剑客
首页
wresource
郭霖
孤寒者
IT邦德
沉默王二
老麦
stackoverflow
GitHub (opens new window)
首页
wresource
郭霖
孤寒者
IT邦德
沉默王二
老麦
stackoverflow
GitHub (opens new window)
  • 基础安卓文章

  • 服务器开发

  • 数据结构

  • Kotlin基础

    • Kotlin能否取代Java(Kotlin的历史以及现状)
    • what?函数的创建只要一行代码(Kotlin中的函数)
      • 一、前言
      • 二、函数的参数
        • 1.默认参数
        • 2.命名参数
        • 3.可变数量的参数
      • 三、函数的类型
      • 四、优化代码的过程
        • 1.原始代码
        • 2.利用kotlin if语句的返回值优化
        • 3.if语句默认执行第一行语句
        • 4.kotlin独特的函数语法糖
    • 你们知道幕后字段吗?(Kotlin中基本类的创建)
    • 一行解决单例模式(Kotlin中常用的类)
  • wresource 安卓
  • Kotlin基础
wresource
2022-08-20
目录

what?函数的创建只要一行代码(Kotlin中的函数)

# 一、前言

先展示一下Kotlin创建的一个一行代码的斐波那契数列的函数,至于用到的特性文末给出

fun fibSeries(n:Int) :Int = if (n <= 2) 1 else fibSeries(n-1) + fibSeries(n-2)
1

斐波那契数列算是最经典的递归函数之一,虽然其他语言可能也可以实现(加大括号的不算,如果这样有些语言的代码几乎都可以折叠成一行,比如c、java等等,但对python那是硬伤)

# 二、函数的参数

Kotlin中函数的参数定义为:

变量名:类型
例如:
a:Int
s:String
1
2
3
4

默认参数是常量即val类型的,即不可在函数里面对参数进行修改

# 1.默认参数

​ 当省略某些参数时可以用默认值替代,这一点如果是在kotlin里面调用是没有问题的,但在java里面调用就需要带上注解@JvmOverloads

//同样这里需要注意的就是默认参数最好要放在后面不然就达不到一般的效果
@JvmOverloads
fun a(x:Int,y:Int = 100){
    return x + y
}
fun main(){
    print(a(33))
    //最后输出133
}
1
2
3
4
5
6
7
8
9

# 2.命名参数

​ 显示的指定参数的值,可以配合默认参数使用

//默认参数当然还是可以写在前面的,但调用的方式不同
//这就是命名参数
@JvmOverloads
fun a(x:Int = 100,y:Int){
    return x + y
}
fun main(){
    print(a(y = 33))
    //同样输出133
    //这里的y一定要和函数里面的函数相匹配
}
1
2
3
4
5
6
7
8
9
10
11

# 3.可变数量的参数

​ 需要添加vararg函数进行修饰

fun myList(vararg items:Int):List<Int>{
    val myItems = ArrayList<Int>()
    for (item in items){
        myItems.add(item)
    }
    return myItems
}
//在主函数中只需要这样调用
val list = myList(2,5,6)
//注意一下如果参数列表还包含其他参数,则需要用命名参数进行调用
//例如
fun myList(vararg items:Int,name:String):List<Int>{
    ....
}
//则调用时需要以以下方式进行调用
val list = myList(4,5,name = "uii")

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 三、函数的类型

  • 返回Unit的函数

    即返回值为空,这个和c语言中的void类似

    fun a():Unit{
        //函数体
    }
    
    1
    2
    3
  • 返回Nothing的函数

    即什么都不返回,一般这个函数执行后下面的代码都不再执行

    fun b():Nothing{
        
    }
    
    1
    2
    3
  • 单表达式函数

    当函数的函数体只有一行代码时,可以省略花括号,直接采用等号连接代码,这个特性可以结合when,if等语句使用,有时候会产生更加简洁的代码

    fun c(n:Int):Int = n*3
    
    1
  • 成员函数

    这个没啥特别的和java里面的成员函数一致,即在类中的函数

  • 局部函数

    即函数里面嵌套一个函数,可以使用外层函数的变量

    fun d(){
        val a = 6
        fun e(){
            println(a*4)
        }
    }
    
    1
    2
    3
    4
    5
    6
  • 尾递归函数

    即函数的尾部也是一个函数的调用,可以用tailrec 优化递归调用过程,虽然下面举得这个例子没什么实际作用,体会一下即可

    tailrec fun b(n:Int):Int = if (n <= 1) 1 else b(n-1)
    
    1
  • Top level 函数

    顶层函数,这个有点类似java里面的静态成员函数,同一个包下的全部文件都可以直接调用这个函数

    //直接在一个kt文件下编写
    fun f(){
        println("hello world")
    }
    
    1
    2
    3
    4
  • 无参的main函数

    //这个最简单了,前面也有涉及
    //虽然主函数也可以有参数,但一般情况下用不到
    fun main(){
        
    }
    
    1
    2
    3
    4
    5

# 四、优化代码的过程

# 1.原始代码

​ 这个是最开始的代码,这段代码和其他语言几乎没有区别

fun fibSeries(n:Int):Int{
    if(n <= 2){
        return 1
    }else{
        return fibSeries(n-1) + fibSeries(n-2)
    }
}
1
2
3
4
5
6
7

# 2.利用kotlin if语句的返回值优化

​ 这一步应该是kotlin的特色,if语句以最后一行的值作为返回值

fun fibSeries(n:Int):Int{
    return if(n <= 2){
        1
    }else{
        fibSeries(n-1) + fibSeries(n-2)
    }
}
1
2
3
4
5
6
7

# 3.if语句默认执行第一行语句

​ 这个应该是许多编程语言所公认的

fun fibSeries(n:Int):Int{
    return if(n <= 2) 1 else fibSeries(n-1) + fibSeries(n-2)
}
1
2
3

# 4.kotlin独特的函数语法糖

​ 如果函数只有一行代码那么可以直接用等号进行连接

fun fibSeries(n:Int):Int = if(n <= 2) 1 else  fibSeries(n-1) + fibSeries(n-2)
1

​ 是不是爱上Kotlin了,简洁的代码格式使得开发过程更加高效,同时代码极具观赏性

上次更新: 2023/04/05, 05:23:58
Kotlin能否取代Java(Kotlin的历史以及现状)
你们知道幕后字段吗?(Kotlin中基本类的创建)

← Kotlin能否取代Java(Kotlin的历史以及现状) 你们知道幕后字段吗?(Kotlin中基本类的创建)→

最近更新
01
How the creator of Angular is dehydrating the web (Ep 574)
06-07
02
For those who just don’t Git it (Ep 573)
06-07
03
Modern work requires attention. Constant alerts steal it
06-07
更多文章>
Theme by Vdoing | Copyright © 2022-2024 IT七剑客 | MIT License
  • 闽ICP备2021006579号-4
  • 闽公网安备 35012102500470号
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式