Kotlin学习笔记

kotlin 学习

kotlin 中使用 vararg 标记可变参数,调用方法:

// 定义
fun test(vararg books : String){...}

// 使用
test("疯狂iOS讲义", "疯狂Android讲义")
var arr = arrayOf("疯狂Kotlin讲义", "疯狂Java讲义")
// 将数组的多个元素传给个数可变的参数
test(*arr)

特性:直接使用函数类型

kotlin 中可直接使用函数类型作为参数和返回值,如

fun map(data : Array<Int>,  fn: (Int) -> Int) : Array<Int>{...}

其中 fn: (Int) -> Int 就是使用函数类型,代表需要传入一个参数为 Int并且返回值为 Int 的函数。使用示例

// 设定一个方法
fun testfun(predicate: String):Boolean{
    return predicate.length > 3;
}

// fn传入参数为String,返回值为 Boolean 的方法 
fun useFun(a:String, fn:(String)->Boolean):String{
    val b:Boolean = fn(a)
    if (b) {return "big"} else {return "small"}
}

// 使用
var result:String = useFun("ja", ::testfun);

同理如使用函数作为返回值:

fun getMathFunc(type: String): (Int) -> Int {...}

关于 it 关键字

it:单个参数的隐式名称
一个 lambda 表达式只有一个参数是很常见的。

如果编译器自己可以识别出签名,也可以不用声明唯一的参数并忽略 ->。 该参数会隐式声明为 it:

ints.filter { it > 0 } // 这个字面值是“(it: Int) -> Boolean”类型的

调用示例:

// 省略形参名,用it代表形参
var square:(Int) -> Int = {it * it}
// 使用square调用Lambda
println(square(5))  // 输出25
println(square(6))  // 输出36

关于 lambda 表达式缩写

  • 传统写法,直接传入匿名函数

     var list = listOf("Java", "Kotlin", "Go")
     // 调用 List 的 dropWhile 方法需要传入 String->Boolean 类型的函数
     // 传统写法,直接传入匿名函数
     list.dropWhile(fun (predicate: String):Boolean{
         return predicate.length > 3;
     })
    
  • 第二种写法,提取匿名函数为一个方法

     fun testfun(predicate: String):Boolean{
         // 假设条件为大于3个字符的字符串
         return predicate.length > 3;
     }
     // 需要传入一个函数参数,与传统写法无区别
     var rt= list.dropWhile(::testfun)
    
  • 第三种缩写,将方法定义为一个lambda表达式传参

    var myfun = {predicate: String ->predicate.length > 3}
    var rt = list.dropWhile(myfun) 
    
  • 第四种缩写,将Lambda表达式放在括号后面,无需使用命名参数,省略形参名,用it代表形参

    var rt = list.dropWhile() {it.length > 3}
    
  • 第五种缩写,省略了 () ,最后一个参数是Lambda表达式,可将表达式写在括号外面

    var rt = list.dropWhile{it.length > 3}
    

lambda 调用

定义Lambda表达式,并在它后面增加圆括号可调用该Lambda表达式

var result = {base: Int , exponent:Int ->
    var result = 1
    for (i in 1 .. exponent) {
        result *= base
    }
    result
}(4, 3)

forEach 中的 lambda

 var list = listOf(3, 5, 30, -25, 14)
// 使用匿名函数执行forEach()方法
list.forEach(fun(n) {
    println("元素依次为:${n}")
    // 匿名函数中的return用于返回该函数本身,会打印出全部原始
    return
})

// 使用Lambda表达式执行forEach()方法
list.forEach{n->
    println("元素依次为:${n}")
    // Lambda表达式中的return用于返回它所在的函数(main函数),只打印第一个元素
    return
}

// 使用Lambda表达式执行forEach()方法
list.forEach(){n ->
    println("元素依次为:${n}")
    // 使用限定返回,此时return只是返回传给forEach方法的Lambda表达式,什么都不打印
    return@forEach
}

在类中自定义 getter 和setter 方法

kotlin 的getter 和setter 方法不走寻常路,需要注意

class Person(name: String, age: Int){
    // 使用private修饰属性,将这些属性隐藏起来
    var name = name
        set(newName){
            // 执行合理性校验,要求用户名必须在2~6位之间
            if (newName.length > 6 || newName.length < 2){
                println("您设置的人名不符合要求")
            } else {
                field = newName
            }
        }
        get() {
            println("执行 name 的getter方法")
            return "Alexander ken"
        }

    // 定义private修饰的属性,该属性是幕后使用
    private var _age: Int = age
    var age
    // 重写getter方法,返回幕后属性的值
        get() = _age
        set(newAge){
            // 执行合理性校验,要求用户名必须在2~6位之间
            if (newAge > 100 || newAge < 0){
                println("您设置的年龄不合法")
            } else {
                // 对幕后属性赋值
                _age = newAge
            }
        }


    var fullName
    // 使用单表达式定义getter方法的方法体
        get() = "${name}"
        set(value) {
            println("执行fullName的setter方法")
            // 如果value字符串中不包含.或包含几个.都不行
            if ("." !in value || value.indexOf(".") != value.lastIndexOf(".")) {
                println("您输入的fullName不合法")
            } else {
                var tokens = value.split(".")
            }
        }
}

fun main(args: Array<String>) {
    var p = Person("李刚", 29)
    p.age = 120 // 赋值非法,不能赋值失败
    println(p.age) // 删除29
    p.age = 25 // 赋值合法,赋值成功
    println(p.age) // 输出25
    println(p.name)
    println(p.fullName)
}

实现接口

kotlin 与 java 的接口实现方式不同,在java 中我们可以直接 new 一个接口对象出来,但是 kotlin 需要使用 object 关键字,如实现 ActivityLifecycleCallbacks 接口:

        val activityLifecycleCallbacks = object : Application.ActivityLifecycleCallbacks {
            override fun onActivityCreated(activity: Activity?, savedInstanceState: Bundle?) {
                TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
            }
      
            ......    
            override fun onActivityDestroyed(activity: Activity) {
            }
        } 

另外需要注意将 :

  TODO("not implemented") 

这句 TODO 删除,否则会抛出异常:kotlin.NotImplementedError: An operation is not implemented: not implemented

“TODO("not implemented")” 这句代码,这句代码在运行的时候会抛出以上异常,这样做的好处是促使我们去实现接口方法或者手动删掉这句代码。

关于 kotlin 中的 ? 与 !! 以及 ?: 三个运算符的解释

这篇博客解释得不错,就不解释了

Kotlin中?和!!的区别
https://www.jianshu.com/p/51b2e5aa3dd8

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

推荐阅读更多精彩内容