Kotlin语言(四):函数

1、输入输出函数

fun main() {
    /**-------------------- 输出函数println() --------------------*/
    println("欢迎来到kotlin世界!")

    /**-------------------- 输入函数readLine() --------------------*/
    print("请输入第一个参数:")
    val a = readLine()?.toInt() ?: -1
    print("请输入第二个参数:")
    val b = readLine()?.toInt() ?: -1
    println("$a + $b = ${a + b}")
}

2、四种函数模型

/**
 * 1、无参无返回值函数(其返回值是Unit,可以不写)
 */
fun sayHello(): Unit {
    println("hello")
}

/**
 * 2、有参无返回值函数(其返回值是Unit,可以不写)
 */
fun sayHello(name: String) {
    println("Hello $name")
}

/**
 * 3、有参有返回值函数
 */
fun getHello(name: String): String {
    return "Hello $name"
}

/**
 * 4、无参有返回值函数
 */
fun getHello(): String {
    return "hello"
}

fun main() {
    sayHello()
    sayHello("Kotlin")
    println(getHello())
    println(getHello("Kotlin"))
}

3、顶层函数

//main函数也是顶层函数
fun main() {

}

//haha也是顶层函数
fun haha() {

}

4、嵌套函数

fun main() {
    //sayHello即为嵌套函数
    fun sayHello() {
        println("hello")
    }
    sayHello()
}

5、函数表达式

fun add(a: Int, b: Int): Int {
    return a + b
}

/**
 * 函数表达式:函数体只有一条语句的函数就是函数表达式
 *
 * (1)去掉{}和return,用=连接
 * (2)去掉返回类型
 */
fun add1(a: Int, b: Int) = a + b
fun sayHi() = println("Hi kotlin !")
fun max(a: Int, b: Int) = if (a > b) a else b

fun main() {
    println(add(1, 2))
    println(add1(10, 20))
    sayHi()
    println(max(5, 6))
}

6、函数引用

fun sub(a: Int, b: Int): Int {
    return if (a > b) a - b else b - a
}

fun main() {
    /**-------------------- ::函数名 --------------------*/
    //::sub:获取sub函数的引用,类似于c语言里的函数指针
    val pSub = ::sub

    /**-------------------- 使用 --------------------*/
    //(1)直接调用
    println(pSub(3, 5))
    //(2)通过invoke调用,这种方式的好处是可以使用空安全调用符 ?.
    println(pSub?.invoke(5, 3))

}

7、匿名函数

fun main() {
    /**
     * 匿名函数(Int, Int) -> Int:代表具有两个Int参数和返回值为Int类型的函数
     */
    val pFun: (Int, Int) -> Int = { a, b -> a + b }
    println(pFun(1, 2))
}

8、函数的默认参数

/**
 * 函数的默认参数
 * 1.method的默认值为GET
 * 2.如果调用的时候只传path,则会使用method默认值GET
 * 3.调用时仍然可以传递method来替换默认值
 *
 * 注:此处可以对比java里面的重载函数来理解,可以避免写很多重载函数。
 */
fun sendRequest(path: String, method: String = "GET") {
    println("path=$path method=$method")
}

fun main() {
    sendRequest("http://www.baidu.com")
    //此处使用默认的GET请求方式,结果为:path=http://www.baidu.com method=GET
    sendRequest("http://www.baidu.com", "POST")
    //此处使用指定的POST请求方式,结果为:path=http://www.baidu.com method=POST
}

9、函数具名参数

/**
 * 函数具名参数
 * 1.具名参数是指在调用时显示指定参数名字
 * 2.使用具名参数时可以不用管参数的顺序
 */
fun enqueueRequest(path: String, method: String = "GET", header: String = "UTF-8") {
    println("path=$path method=$method header=$header")
}

fun main() {
    enqueueRequest("http://www.baidu.com")
    //结果:path=http://www.baidu.com method=GET header=UTF-8

    /**-------------------- 使用具名参数调用函数 --------------------*/
    enqueueRequest(path = "http://www.baidu.com")
    //结果:path=http://www.baidu.com method=GET header=UTF-8
    enqueueRequest(path = "http://www.baidu.com", method = "POST")
    //结果:path=http://www.baidu.com method=POST header=UTF-8
    enqueueRequest(header = "GBK", method = "POST", path = "http://www.baidu.com")
    //结果:path=http://www.baidu.com method=POST header=GBK
}

10、函数可变参数

/**
 * 1.vararg关键字修饰参数即为可变参数
 * 2.其参数类型变成对应的数组类型
 *
 * 注:对比于java里面的:int... x
 * 求n个Int数据的和
 */
fun add(vararg x: Int): Int {
    //这里的x的数据类型为IntArray
    var result = 0
    x.forEach {
        result += it
    }
    return result
}


fun main() {
    val result = add(1, 2, 3, 4, 5, 6, 7, 8, 9, 0)
    println("result=$result")
    //result=45
}
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,047评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,807评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,501评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,839评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,951评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,117评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,188评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,929评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,372评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,679评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,837评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,536评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,168评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,886评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,129评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,665评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,739评论 2 351

推荐阅读更多精彩内容

  • 原文链接:https://github.com/EasyKotlin 值就是函数,函数就是值。所有函数都消费函数,...
    JackChen1024阅读 5,962评论 1 17
  • 这篇文章以《C++ Primer》(第五版)为基础,结合自己的理解,将C++11的新特性加以总结、概括,以加深印象...
    toMyLord阅读 822评论 2 6
  • Swift003-访问修饰词 函数 闭包 访问限制词 在 Swift 语言中,访问修饰符有五种,分别为 filep...
    DDY阅读 367评论 0 0
  • 函数有两种用途: 完成指定任务,此时函数作为调用语句使用。 计算并返回值,此时函数作为赋值语句的表达式使用。 调用...
    JunChow520阅读 3,747评论 0 3
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,513评论 1 51