快速学习Kotlin(三)函数

Kotlin

在Kotlin中没有方法这个概念,转而存在的是函数的概念。

函数的声明

我们声明一个函数,使用fun关键字来修饰函数。

fun print(){
    print("this is message");
}

fun print(str:String){
    print("this is message $str");
}

fun print1(str:String = "hello"){
    print("this is message $str");
}

fun printMessage() = print("this is kotlin");

fun printMsg():String = "this is kotlin";

我们可以看到这里我写了五种函数的书写方式。

第一种,是我们常用的方式,小括号里面没有参数,我们可以直接输出print信息。

第二种,里面是有一个参数str,我们在使用的时候可以传入一个参数,之后用print打印出这个参数值。

第三种,kotlin可以在参数中设置一个默认值,例如这里我将str设置了一个默认值"hello",当在使用这个函数print1的时候没有传入str这个参数,那么输出的时候将采用默认值来输出。结果打印this is message hello。这是kotlin中特有的语法。

第四种,如果函数中只有一条语句,那么我们可以直接使用"="来将这一条语句直接赋值给这个printMessage()函数。

第五种,同理第四种情况,如果函数有返回值并且也只有一条语句,那么我们也同样可以直接赋值操作。

函数的嵌套

我们来看下面这段代码

fun function(){
    var str:String = "hello";

    fun getFunction(){
        var msg:String = "world";
        var account:Int = 100;
        print("$str $msg");

        if (account >= 100){
            account--;
        }
        getFunction();
    }
}

可以看到在function这个函数中嵌套了另外一个函数getFunction(),并且在getFunction()中使用到了外部函数Function的变量str。这个有点像Java中内部类的概念。在Kotlin中允许函数内再嵌套另外一个函数,并且内部的函数可以调用外部函数声明的变量,并且函数自身还可以调用自身。这种写法一般用于某些情况下触发递归的方法,或者是不希望被外部函数访问到的情况。因为作为内部函数是不会被外部函数所访问到的。

扩展函数

扩展函数数是指在一个类上增加一种新的行为,甚至我们没有这个类代码的访问权限。这是一个在缺少有用函数的类上扩展的方法,Kotlin能够为我们做到那些令人关注的事情,而这些Java做不到。简单来说,Kotlin扩展函数允许我们在不改变已有类的情况下,为类添加新的函数。

fun Activity.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT){
    Toast.makeText(this, message, duration).show()
}

看到在这里我们写了一个扩展函数toast;这个函数基于Activity这个类中进行的扩展,参数有两个,一个为需要显示的内容文字,另一个为显示的时长。

当我们在调用这个函数的时候可以直接调用

override fun onCreate(savedInstanceState: Bundle?) { 
    super<BaseActivity>.onCreate(savedInstanceState)
    toast("This is onCreate!!")
    toast("Hello world!", Toast.LENGTH_LONG)
}

我们可以在任何地方(例如在一个工具类文件中)声明这个函数,然后在我们的Activity中将它作为普通方法来直接使用。

有一点值得注意:扩展函数并不是真正地修改了原来的类,它的这些作用效果是以静态导入的方式来实现的。扩展函数可以被声明在任何文件中,因此有个通用的方式是把一系列有关的函数放在一个新建的文件里,就像我们刚才所说的工具类当中。

例如我们在使用图片的时候也可以用扩展函数来处理

fun ImageView.loadImage(context: Context, path: String, placeholder: Int = R.mipmap.ic_launcher, useCache: Boolean =false) {
    var options = getOptions(placeholder, useCache)
    Glide.with(context).load(path).apply(options).into(this)
}

看到我们在常用的Glide图片库时候,可以通过扩展库来处理,并且指定默认的控件id、图片地址、是否使用缓存等等一系列操作。这么用起来是不是特别舒服呢?

高阶函数

高阶函数是指,函数的参数又是一个函数,所以称之为高阶函数。比如 lock() 就是一个很好的例子,它接收一个 lock 对象和一个函数,运行函数并释放 lock;

fun <T> lock(lock: Lock, body: () -> T ) : T {
    lock.lock()
    try {
        return body()
    }
    finally {
        lock.unlock()
    }
}

现在解释一下上面的代码吧:body 有一个函数类型 () -> T,把它设想为没有参数并返回 T 类型的函数。它引发了内部的 try 函数块,并被 lock 保护,结果是通过 lock() 函数返回的。 如果我们想调用 lock() ,函数,我们可以传给它另一个函数做参数

fun toBeSynchroized() = sharedResource.operation()

val result = lock(lock, ::toBeSynchroized)

其实最方便的办法是传递一个字面函数(通常是 lambda 表达式):

val result = lock(lock, {
sharedResource.operation() })

如果觉得我的文章能够帮助到你,也欢迎关注我的微信公众号「晨雨细曲」,有新技术和知识会推送在这上面。

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

推荐阅读更多精彩内容

  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,124评论 9 118
  • 本文是在学习和使用kotlin时的一些总结与体会,一些代码示例来自于网络或Kotlin官方文档,持续更新... 对...
    竹尘居士阅读 3,256评论 0 8
  • 原文链接:https://github.com/EasyKotlin 值就是函数,函数就是值。所有函数都消费函数,...
    JackChen1024阅读 5,931评论 1 17
  • 热浪将月光埋葬 我无力的捧起带着汗水的星光 总是期待着未来和未知的远方 却不知最真的温柔就在身旁 一个人自认为惊艳...
    雷声狂阅读 282评论 0 1
  • -1- 中午定了闹钟,睡了一个小时,醒后感觉睡得又热又累,将空调调到了25度。 我坐在床头看了两个章节的《傲慢与偏...
    文小辉cool阅读 149评论 0 3