Kotlin使用关键字解释、基本规范分享

经过初步的学习,在项目中使用了一段时间kotlin后,汇总小组各个成员的心得体会,在此做个记录。

operator关键词 操作符重载

 使用举例
  ```kotlin
   val mOnClickCallBack1: (Int) -> Unit =
        { position -> Toast.makeText(this, "position:$position", Toast.LENGTH_LONG).show() }
   val mOnClickCallBack2: OnItemClickCallback = object : OnItemClickCallback {
        override fun invoke(position: Int) {
            Toast.makeText(this@MainActivity, "position:$position", Toast.LENGTH_LONG).show()
        }
    }
  mBtApp.setOnClickListener(object : View.OnClickListener {
        override fun onClick(v: View?) {
            mOnClickCallBack1(1)
            mOnClickCallBack1.invoke(1)
            mOnClickCallBack2.invoke(1)
           //mOnClickCallBack2(1)//想这么使用需要用operator重载 invoke方法
        }
    })
 ```

标准函数的使用选择

10069305-9098acc2fbba7a58.png

总结如下:
需要返回本身this 用apply、also
传递this作为参数用apply 传递it用also

不需要返回本身this 用run let with
需要空检查 用run let 不需要空检查用with
传递this作为参数用run with 传递it作为参数用let

成员变量不稳定性

成员变量具有不稳定性,非空判断并不能将其自动转换为非空类型
使用举例

{
      mWeather = Weather("25C", "雨", true)
      //if (mWeather!=null){ 
      //    mWeather.temp
      //}
      //应如下使用:
      mWeather?.temp
}

lateinit Lazy 使用说明

lateinit 就是一个修饰符 被修饰的变量不用做非空校验
Lazy 是一种代理,真正的懒加载对性能有提升

reified 关键词说明

这个单词,也是起的有点犀利,reified 翻译一下就是: 具体化。可以理解为 具体化一个东西。
常用在泛型的具体化
见:package org.jetbrains.anko Intents.kt startActivity

open

使用带open关键词的val对象,来设计基类。可以让这个成员变量又是val类型不可修改,又可以在子类中更改

open val likeDataProvideListener: (() -> CardLikeRequestData)? = null

!!

尽量不要让代码中出现!!强行忽略空判断,大量使用!!的时候需要看一下是否是设计出了问题,该变量是否可以设计成非空类型。

如果实现了java的一个接口,kotlin可能会默认将其中的参数类型设置为可能为空,如果确定在这里不会为空的时候可以直接删除 ? 且不会报错。

多使用闭包

可以使用闭包来代替一些简单的接口

open val likeDataProvideListener: (() -> CardLikeRequestData)? = null

it嵌套

如果有多个 let 函数嵌套的时候,会出现 it 嵌套的情况,这种时候会对当前 it 是什么造成疑惑。这种情况要给后面的 it 修改命名。

扩展函数

Collection和String有大量的扩展函数,使用起来会很方便

Collection 扩展函数

  1. .forEach 扩展函数,遍历集合
  2. .isNullOrEmpty 扩展函数,判断集合是null或者为空
  3. .forEachWithIndex 扩展函数,遍历集合并且可以拿到index
  4. .lastIndex 扩展属性,最后一个index

String 扩展函数

  1. .isNullOrBlank 扩展函数,是null或者长度为0或者只有空格
  2. .isNullOrEmpty 扩展函数,是null或者长度为0

?: return

在执行逻辑的时候,可能会有类似下面这样的代码

// a的类型为A? A中有一个属性b类型为B?
val b :B? = a?.b ?: null
// 此时b的类型为 B?
if (b != null) {
    // dosomething
}

这种时候可以替换成

val b :B = a?.b ?: return
// 此时b的类型为 B
// dosomething

让代码更简洁

Kotlin实现Parcelable

方法一:使用注解
1.在gradle中添加
android {
...
//使用Kotlin实验特性
androidExtensions {
experimental = true
}
}
2.使用注解标记数据类并实现Parcelable接口

@Parcelize
data class User(val name: String, val age: Int) : Parcelable

方法二
AS搜索Parcelable Code Generator(for kotlin)插件安装

lambda表达式

1、lambda表达式始终存在于一对{}中,如下:

图片.png

2、 高阶函数(形参)

高阶函数就是以另一个函数作为参数或返回值的函数
如果用 lambda 来作为高价函数的参数(此时为形参),就必须先了解如何声明一个函数的形参类型,如下:


图片.png
// printSum 为高阶函数,定义了 lambda 形参
fun printSum(sum:(Int,Int)->Int){
        val result = sum(1, 2)
        println(result)
}
// 以下 lambda 为实参,传递给高阶函数 printSum
val sum = {x:Int,y:Int->x+y}
printSum(sum)

有了高阶函数,我们可以很轻易地做到一个 lambda 嵌套另一个 lambda 的代码结构

3、大括号放在最后

Kotlin 的 lambda 有个规约:如果 lambda 表达式是函数的最后一个实参,则可以放在括号外面,并且可以省略括号,如:

person.maxBy({ p:Person -> p.age })
// 可以写成
person.maxBy(){
    p:Person -> p.age
}
// 更简洁的风格:
person.maxBy{
    p:Person -> p.age
}

4、带接收者的 lambda

图片.png

带接收者的 lambda 丰富了函数声明的信息,当传递该 lambda值时,将携带该接收者,比如:

// 声明接收者
fun kotlinDSL(block:StringBuilder.()->Unit){
  block(StringBuilder("Kotlin"))
}
// 调用高阶函数
kotlinDSL {
  // 这个 lambda 的接收者类型为StringBuilder
  append(" DSL")
  println(this)
}

总而言之,lambda 在 Kotlin 和 Kotlin DSL 中扮演着很重要的角色,是实现整洁代码的必备语法糖。

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

推荐阅读更多精彩内容