Kotlin基础学习

重要的网址

插件官网地址 (studio 有时更新不下来自己下载手动安装)
https://plugins.jetbrains.com/plugin/6954-kotlin

接口
使用关键字 interface 来定义接口(注意可选方法体的实现)

interface MyInterface {
    fun bar()
    fun foo() {
      // 可选的方法体
    }
}

接口实现
class Child : MyInterface {
    override fun bar() {
        // 方法体
    }
    //foo() 根据情况选择实现
}
扩展

概念:
能够扩展一个类的新功能而无需继承该类或使用像装饰者这样的任何类型的设计模式。 这通过叫做扩展的特殊声明完成,简单说就是这个对象的功能不能满足我,我用对象.xxxx(){}给你新添加一个属性来满足我,然后整个项目都能用这个属性

class C {
    fun foo() { println("member") }
}

fun C.foo() { println("extension") 
}

调用 C().foo(1) 将输出 "extension"。


实例(MutableList是系统级别):

fun MutableList<Int>.swap(index1: Int, index2: Int) {//swap(x,x)是不满足当前应用的一个自定义扩充
    val tmp = this[index1] // “this”对应该列表
    this[index1] = this[index2]
    this[index2] = tmp
}

然后再项目里的任何用到的类里都能直接调用,而不是之前java各种单利,各种xxUtils.swap(x,x),都不需要

val l = mutableListOf(1, 2, 3)
l.swap(0, 2) // “swap()”内部的“this”得到“l”的值

扩展的作用域

package vodjk.com.utils

import android.app.Activity
fun Activity.toask(des: String) {
}
fun MutableList<Int>.swap(index1: Int, index2: Int) {
}

依此类推各种Activity.swap(xxx),各种Toask.swap(xxx),各种扩充,是不是很方便

密封类

特别类型java里的工厂模式

package com.xingen.kotlin

fun main(str: Array<String>) {
    test( BaseClass.Test1() )
    test( BaseClass.Test2() )
    test( BaseClass.Test3 )
}

/**
 * 使用when表达式
 */

fun test(instance: BaseClass)=when(instance){
    is BaseClass.Test1-> instance.test()
    is BaseClass.Test2-> instance.test()
    is BaseClass.Test3->instance.test()
}
/**
 *
 * sealed修饰符修饰密封类。
 *
 * 密封类内部含有多个子类。
 */
sealed class BaseClass {

    class Test1 : BaseClass() {
        override fun test() {
            println("Test1实例")
        }

    }
    class Test2 : BaseClass() {
        override fun test() {
            println("Test2实例")
        }
    }
    object Test3 : BaseClass() {
        override fun test() {
            println("Test3实例")
        }
    }
    open fun test() {
        println("BaseClass实例")
    }
}
空安全

Kotlin 的类型系统旨在消除来自代码空引用的危险,也称为《十亿美元的错误》哈哈

允许为空
如果要允许为空,我们可以声明一个变量为可空字符串,写作 String?:

var b: String? = "abc"
b = null // ok

val l = a.length(对于这句当b=null时不会报NPE,但是这样写不是安全的)

解决方案1

if (b != null && b.length > 0) {
    print("String of length ${b.length}")
} else {
    print("Empty string")
}

解决方案2 kotlin的安全调用

b?.length(是安全调用操作符,写作 ?.)

如果 b 非空,就返回 b.length,否则返回 null,这个表达式的类型是 Int?。

bob?.department?.head?.name

假如一个对象为空,能不能忽略不计或者跳过呢 Elvis 操作符 就来了

java模式的写法是

val l: Int = if (b != null) b.length else -1
Elvis 操作符表达,写作 ?:

val l = b?.length ?: -1
委托

类委托

interface Base {
    fun print()
}

class BaseImpl(val x: Int) : Base {
    override fun print() { print(x) }
}

class Derived(b: Base) : Base by b

fun main(args: Array<String>) {
    val b = BaseImpl(10)
    Derived(b).print() // 输出 10
}

Derived 的超类型列表中的 by-子句表示 b 将会在 Derived 中内部存储。 并且编译器将生成转发给 b 的所有 Base 的方法。
请注意,覆盖会以你所期望的方式工作:编译器会使用你的 override 实现取代委托对象中的实现。如果我们为 Derived 添加 override fun print() { print("abc") },该程序会输出“abc”而不是“10”。

属性委托

延迟属性(lazy properties): 其值只在首次访问时计算,

可观察属性(observable properties): 监听器会收到有关此属性变更的通知


//初始化
 var index: Int by Delegates.observable(1) {
        pro, oldValue, newValue ->
        if (newValue == 20) {
            toast("关闭")
            Log.e("Test", oldValue.toString() + "关闭" + newValue)
        } else {
            Log.e("Test", oldValue.toString() + "开启" + newValue)
        }
    }

//赋值
for (i in 0..40) {index = i}
        
把多个属性储存在一个映射(map)中,而不是每个存在单独的字段中。
http://www.runoob.com/kotlin/kotlin-delegated.html

Lambda 表达式语法

lambda 表达式总是被大括号括着, 完整语法形式的参数声明放在括号内,并有可选的类型标注, 函数体跟在一个 -> 符号之后。如果推断出的该 lambda 的返回类型不是 Unit,那么该 lambda 主体中的最后一个(或可能是单个)表达式会视为返回值。

val sum: (Int, Int) -> Int = { x, y -> x + y }

lambda 表达式语法缺少的一个东西是指定函数的返回类型的能力,所以匿名函数就出来了
匿名函数看起来非常像一个常规函数声明,除了其名称省略了。其函数体可以是表达式(如上所示)或代码块:

fun(x: Int, y: Int): Int {
    return x + y
}
this限定词

为了表示当前的 接收者 我们使用 this 表达式

1:在类的成员中,this 指的是该类的当前对象
2:在扩展函数或者带接收者的函数字面值中, this 表示在点左侧传递的 接收者 参数。
3:如果 this 没有限定符,它指的是最内层的包含它的作用域。要引用其他作用域中的 this,请使用 标签限定符:

class A { // 隐式标签 @A
    inner class B { // 隐式标签 @B
        fun Int.foo() { // 隐式标签 @foo
            val a = this@A // A 的 this
            val b = this@B // B 的 this

            val c = this // foo() 的接收者,一个 Int
            val c1 = this@foo // foo() 的接收者,一个 Int

            val funLit = lambda@ fun String.() {
                val d = this // funLit 的接收者
            }


            val funLit2 = { s: String ->
                // foo() 的接收者,因为它包含的 lambda 表达式
                // 没有任何接收者
                val d1 = this
            }
        }
    }
}
Kotlin 中创建类似 Java 的静态方法

java static 的写法

public class Utils {
    public static boolean isEmpty(String string){
        return string != null && string.length() == 0;
    }
    public static boolean isWeakEmpty(String string){
        return isEmpty(string) && string.trim().length() == 0;
    }
}

用法:
boolean result = Utils.isEmpty(name);

kotlin 的写法

//使用object关键字创建作用类

object Utilss {
    fun isEmpty(string: String?): Boolean {
        return string != null && string.length == 0
    }
    fun isWeakEmpty(string: String): Boolean {
        return isEmpty(string) && string.trim { it <= ' ' }.length == 0
    }
}

//调用方式
println(Utils.isEmpty(username))

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

推荐阅读更多精彩内容