Kotlin学习笔记(基础记录)

未完待续······太监直播吃电脑(●'◡'●)

一.基础操作符、语法、定义等
  • val --> 常量 ; var --> 变量

  • 继承、实现 :: 引用

fun isOdd(x: Int) = x % 2 != 0
println(numbers.filter(::isOdd)) // 输出 [1, 3]
  • =、==、=== 分别表示 赋值、比值、比引用

  • is 、!is --> instanceof

  • $ (取值符)

  • .. 表示区间 1..5 --> 1至5

  • ?相关:

val num : Int? = number  //标识num允许为null,但是会将num自动装箱
num?: println("num is null")  //?: 在num为null时
num?.let { println("num not null") }  //?.let在num非null时
  • 构造函数constructor
    一个类可以有一个主构造函数和多个次构造函数,且主构造函数不能包含任何代码,代码仅能置于init块中:
class Customer constructor(name: String) {
    init {
        logger.info("Customer initialized with value ${name}")
    }
}

通过:this调用其它构造方法:

 constructor(name: String, parent: Person) : this(name)
  • open 开放类/成员: open 标注与 Java 中 final 相反,它允许其他类 继承这个类、重写某个方法。默认情况下,在 Kotlin 中所有的类都是 final

  • setter、getter 的使用:

val isEmpty: Boolean(可以省略类型)
    get() = this.size == 0
var name: String
    set(value) {
        this = value
    }
  • as类型强转符
    fun getMvpView():V{
        return this as V
    }
  • 属性修饰符
private  //自身可见
protected //自身及子类可用
internal  //本模块(module)内可用
public  //任何客户端可用
  • when的使用
          when(tag1){
            "a" -> println("a")
            "abc" -> println("bb")
            is String -> println("string")
            else -> println("unknow")
        }
  • 方法由fun声明,且类型声明后置 (方法参数类型、返回值类型等):
val number : Int = 555
fun sum(a: Int, b: Int): Int {
    return a + b
}
fun sum(a: Int = 1, b: Int = 2) : Int = a + b
  • 允许为方法参数设置默认值 :
fun sum(a: Int = 1, b: Int = 2): Int {
  return a + b
}
  • 数组Array相关:
//创建数组
val myAray = arrayOf(1,2,3)
val myArrat = Array(3,{i -> i })
//遍历
for (s in myAray)
     println(s)
  • List:
val list = listOf<String>("a","b","c")
val list1 = List(3,{i -> i })
list.filter { s -> s != "a" } //过滤
list.map { s -> s+"@" } //变化
  • 对象声明 object关键字后加对象管理者名称
object Hero {
    fun getInstance() : Hero {
        return Hero()
    }
}
Hero.getInstance()
  • 伴生对象 companion object关键字声明

  • 匿名对象的创建(方便的是匿名对象访问外部变量时不必再去申明final类型了):

val noName= object {
        var x: Int = 0
        var y: Int = 0
    }
  • 单例
object Singletons {
    val something: OfMyType by lazy() { ... }

    val somethingLazyButLessSo: OtherType = OtherType()
    val moreLazies: FancyType by lazy() { ... }
}
  • by lazy{} 只能用在val类型, lateinit 只能用在var类型
二.函数、Lambda、代码分析
  • 1.函数扩展:为某个类定义一个扩展函数,使得在任何地方都可以通过对象.函数名的方式去调用改函数。(简化了通过extend创建子类)
    常见的使用场景就是拓展Context类,增加一个showToast的简单方法,避免每次show Toast的大量重复代码,:
fun Context.showToast(message:String = "this is a toast",length : Int = Toast.LENGTH_SHORT){
Toast.makeText(this,message,length)
}

如果一个类定义有一个成员函数和一个扩展函数,而这两个函数又有相同的接收者类型、相同的名字 并且都适用给定的参数,这种情况总是取成员函数。 例如:

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

如果我们调用 C 类型 c的 c.foo(),它将输出“member”,而不是“extension”。

  • 2.属性扩展 (布能直接初始化,只能通过setter、getter):
val <T> List<T>.lastIndex: Int
    get() = size - 1
  • 3.copy()函数,可以理解为拷贝一个对象,仅改变其部分成员值

  • 4.函数的命名参数(当函数有默认参数值时,我们可以通过命名参数的方式,指定某几个参数的值,而其他参数仍采用默认值):

fun goEasy(name : String = "me", 
            time : String = "now",
            isShow: Boolean = true): Unit{}
goEasy()   //使用默认参数
goEasy(name = "axe",isShow = false)    //命名参数
  • 5.vararg可变数量的参数,动态参数,省去了重载:
fun <T> asList(vararg ts: T): List<T> {
    val result = ArrayList<T>()
    for (t in ts) // ts is an Array
        result.add(t)
    return result
}
  • 6.函数作用域:
全局函数,在kt文件中申明,可以在全局使用;
成员函数,类中申明;
内部函数,在函数内部还可以申明函数,并可以访问父外部函数的变量,可以参考匿名内部类
  • 7.高阶函数,函数的参数是另一个函数体(一般传一个lambda表达式,必须制定参数类型和返回值类型):
fun <T> lock(lock: Lock, body: () -> T): T {
    lock.lock()
    try {
        return body()
    }
    finally {
        lock.unlock()
    }
}
val result = lock(lock, { sharedResource.operation() })
  • 8.Lambda相关:
lambda 表达式总是被大括号括着
其参数(如果有的话)在 -> 之前声明(参数类型可以省略)
函数体(如果存在的话)在 -> 后面
如果函数字面值只有一个参数, 那么它的声明可以省略(连同 ->),其名称是 it
ints.map { it->(省略)it * 2 }
  • 9.告别findViewById,可以直接把控件的id当作其实例使用,但是前提:
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
import kotlinx.android.synthetic.main.activity_read_detail.*;
headText.text = "放开我~你就能刷新了哦(●'◡'●)"
headText.gravity = Gravity.CENTER
  • 10.with()扩展函数:在with代码块中我们可以使用this和直接访问所有的public的方法和属性
inline fun <T> with(t: T, body: T.() -> Unit) { t.body() }

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

推荐阅读更多精彩内容