各个语言的精华集聚一身的新时代语言Kotlin,Google下定决心,将kotlin作为Android原生语言。

1、变量空指针检查:
(1)变量直接赋值为null,不允许,会检查报错。所以想要赋值为null,可以加一个 ?。

(2)使用一个赋值为null的变量,会报错,所以补救措施如下:
a.变量后面加?,如果变量是null,后面不在执行,不会引发空指针异常
b.变量后面!!,不论变量是不是null,都执行(和java一样)
c.变量判空处理(和java一样)

2、val与var:
(1)val,可读,不可改变量。如果后面对变量重新赋值,会报错。
(2)var,可读,可改变量。
(3)val与var使用场景:尽量使用val,如果后续变量需要更改,就是用var。

3、类型推断:
(1)变量定义,可以由赋值推断出变量的类型,不用特意声明变量的类型。

(2)kotlin是静态语言还是动态语言?
是静态语言,因为在编译期就已经决定了类型,后面赋值其他类型,会报错,不允许。

4、Unit == Java void,比如main函数就是Unit类型的

5、函数可以通过 = 代替 {}

6、函数返回类型可以不写,由等号后面的推断出来

7、内置数据类型(kotlin数据类型都是类,所以首字母大写。比如Int,最终会转为Java的int):
(1)String: 字符串
(2)Char: 单字符
(3)Boolean: true/false
(4)Int: 整型
(5)Double: 小数
(6)List: 集合
(7)Set: 无重复的元素集合
(8)Map: 键值对的集合

8、编译时常量:
(1)编译时常量只能是常用的基本数据类型:String, Double, Int, Float, Long, Short, Byte, Char, Boolean
(2)编译时常量只能在函数之外定义。为什么?因为,如果在函数之内定义,就必须在运行时才能调用函数赋值,何来编译时常量一说。
(3)结论:编译时常量只能在函数之外定义,就可以在编译期间赋值

9、引用类型:
(1)Java语言有两种数据类型:
第一种:基本数据类型:int double 等。
第二张:引用类型 String 等。
(2)Kotlin语言只有一种数据类型:看起来都是引用类型,实际上编译器会在Java字节码中,修改成“基本类型”。

10、range表达式,即 …
(1)… 包含起止点和终止点。
(2)in 在之内,包含起止和终止。
(3)!in 取反,不在这个范围,起止和终止以外的范围,即小于起止点且大于终止点。

11、when表达式:
(1)kotlin的when相当Java的switch,但是kotlin的when是表达式,不是语句。之所以说是表达式,是因为有返回值的。
(2)when表达式,要求必须要有一个else的默认分支。
(3)如果各个分支都返回同一种类型,那么when表达式就是这种类型,比如都是返回String类型,那么when表达式就是String类型的。如果这些分支返回类型多于一种,那么when表达式就是Any类型。Any类似Java的object。
(4)如果用一个变量接收这个when表达式的返回值,当某个分支没有返回值时,这时变量会赋值“kotlin.Unit”,即无返回类型含义,类似Java的void。
(5)如下图,执行对应分支时候,info会被赋值相应分支的数值。
(6)注意:when表达式中,没有break或continue,同时使用 ->,箭头函数指向代码块。


12、String模板:
(1)kotlin里字符串的拼接可以用$,不用像Java用+。
(2)若避免拼接的变量与后面的文本连接到一起,可以用{}把变量或者表达式包含在内;当然,拼接的变量和后面文本之间有空格,也可以哪些是变量,哪些是文本。
(3){}里可以任意写表达式,可以继续用“”写字符串,不用顾忌外面那层的“”。

13、函数头:
(1)默认是public
(2)fun:函数声明关键字
(3)函数名
(4)函数输入参数(可以没有入参)
(5)返回类型

14、函数参数的默认参数:
(1)函数定义参数时候,可以有默认参数。也就是,参数可以像定义变量的形式,直接有默认值。
(2)有默认参数的函数,调用可以传递参数,也可以不传。如果传,就会覆盖默认参数数值;如果不传,就用默认参数数值。

15、具名函数参数:
(1)调用函数时候,参数可以写具体参数名称,然后随意改变赋值顺序。

16、Unit函数特点:
(1)Unit不写,默认也有。
(2)Unit代表无参数返回的类型 == Unit类型类。
(3)Java的void关键字(无参数返回的,忽略类型),是关键字,不是类型。

17、Nothing类型特点:
(1)即TODO,这个不是注释,而是终止程序。

18、反引号在函数名中特点:
(1)反引号 `。
(2)比如,kotlin中调用Java方法,但是方法名在kotlin是关键字,为了调用正常,避免识别成关键字,可以方法名左右加上反引号。
(3)在kotlin里如果非得用数字作为函数名,可以数字左右加上反引号。


19、匿名函数:
(1)没有函数名称,只有一个大括号。

20、函数类型&隐式返回:
(1)匿名函数最后一行不写return,隐式已经return。最后一行,就是返回值。

21、函数参数:
(1)函数参数名称可以放在实现体里,用 -> 与实现体分开。

22、it 关键字:
(1)当函数只有一个参数时候,it 就是那个参数,可以不用显式写参数名称。

23、匿名函数的类型推断:
(1)匿名函数可以不用明确指定类型,会根据实现体里最后一行类型决定函数类型。
(2)匿名函数 == lambda表达式。

24、在函数中定义参数是函数的函数:
(1)函数中,某个参数是一个函数的声明。其实这种就类似Java中某个参数是接口,效果完全等价。
(2)调用时候,如果这个是函数的参数,是最后一个参数,可以放到()外面,用 { } 直接实现,同时传入。(函数最后一个参数,可以放到后面)
(3)== 相当Java中的equal。
(4)函数参数声明:比如,name: String,不允许参数传入null;name: String?,允许参数传入null。



25、函数内联:
(1)函数定义时候,fun关键字前面加上inline关键字,即函数内联。
(2)函数有使用lambda作为参数(参数中有函数的声明写法),就需要声明成内联。
(3)如果具备条件的函数,不使用内联,在调用端,会生成多个对象来完成lambda的调用,造成性能损耗。
(4)如果具备条件的函数,使用内联,会把代码替换到调用处,调用处没有任何函数开辟、对象开辟的损耗。
(5)小结:如果函数参数有lambda,尽量使用inline,这样内部会做优化,减少函数开辟、对象开辟的损耗。

26、函数引用:
(1)普通函数,通过两个冒号,变为函数类型的对象。
(2)lambda属于函数类型的对象,所以需要传一个函数引用。
(3)lambda参数对应的函数实现,函数名称可以和lambda参数名称不一样。
(4)这个lambda参数对应的实现函数,就是具名函数。因为,调用时候,这个匿名函数,就有具体名字了。

27、函数类型作为返回类型:
(1)这个函数的返回类型是一个函数,不像以往返回类型是String等。
(2)如果返回一个函数,那么函数的返回类型,需要声明这个函数。
(3)如果函数的返回值,是一个函数,可以继续用这个返回值调用这个返回的函数。

28、可空性特点:
(1)默认值是不可空类型,不能随意给null。
(2)如果可以赋值null,需要声明时候,加 ?。

29、安全调用操作符 ? :
(1)如果一个变量等,可以赋值为null,那么使用时候必须加 ?,给出补救措施。
(2)? 作用:如果变量等是null,? 后面这一行代码不执行,不会引发空指针异常。

30、使用带let的安全调用:
(1)可以把调用let的变量等带到{ }里面使用,即 it。
(2)it.isBlank():判断是否it没有内容,即””。如果内容是空格,即” ”,也算作有内容。it.isBlank(),返回false。

31、非空断言操作符特点:
(1)!! 断言,不管变量等是否为null,都执行,这个和Java一样。

32、空合并操作符:
(1)?: 空合并操作符,如果是null,执行冒号后面的内容,否则执行前面内容。
(2)null值也可以调用let函数。如果有?,只是null值时候,进入不了let函数。
(3)let函数 + 空合并操作符,调用let函数时候,变量等必须加?。当有?,null才不进入let函数里,然后空合并操作符才生效。


33、异常处理与自定义异常特点:
(1)try catch 作用:当try里有异常,走catch,不至于出现异常,程序崩掉。
(2)当try里某行抛出异常,那么try里此行后面语句不再执行。
(3)当try里有异常时候,那么接下来走到catch里,之后继续执行try catch之后的语句。
(4)catch,就是捕获异常的,当try里有异常抛出时候,就会被捕获,然后执行catch里的语句,比如打印具体捕获的什么异常。
(5)try里出现异常,会把具体什么异常信息传递到catch里。

34、先决条件函数:
(1)检查函数,如果为null、false等,就会抛出异常。
(2)null 检查函数,若null抛异常:checkNotNull()、requireNotNull()。
(3)false 检查函数,若false抛异常:require()。

35、substring用法:
(1)和Java用法没什么区别,不过kotlin里,一般用 until 方式,不用 ,方式。

36、split操作:
(1)和Java用法没什么区别,只不过kotlin可以定义变量接收,因为可以自动类型推断。

37、replace完成加密解密操作:
(1)替换时候,可以传递一个正则表达式,同时具体如何替换,可以自己完善函数。
(2)正则表达式传递哪些字符,决定了对哪些字符操作替换生效。比如,正则表达式里只有A B C,即使when表达式,有对D字符的替换实现,也不会生效。
(3)正则表达式里字符顺序,可以随意写,不用和原始密码字符顺序一致。


38、== 与 ===比较操作:
(1)==:值、内容的比较,相当于Java的equals
(2)===:引用的比较

39、字符串遍历操作:
(1)遍历用的forEach{}函数,函数{}里有默认参数it。
(2)it指代字符串的每一个字符。
(3)如果不想用默认it参数名,也可以覆盖参数名,自己定义参数名。

40、数字类型的安全转换函数:
(1)以字符串转为Int为例,尽量使用函数toIntOrNull()函数。如果转换成功,返回Int值;如果转换失败,返回null。

41、Double转Int与类型格式化:
(1)toInt(),直接舍弃后面小数。
(2)roundToInt(),四舍五入方式转Int,更精确。
(3)以Double保留3位小数为例,val r = ”%.3f”.format(65.83489442),其中r类型是String,采用的是四舍五入方式保留3位小数。

42、apply内置函数:
(1)apply函数特点,始终返回调用者本身。
(2)大部分情况,匿名函数都会持有一个it。但是apply函数不会持有it,而是持有当前this。
(3)apply函数始终返回调用者本身,所以可以链式调用。


43、let内置函数:
(1)let函数返回类型,是根据匿名函数最后一行的变化而变化。
(2)let函数的匿名函数里面持有的it是调用者本身。


44、run内置函数:
(1)run函数返回类型,是根据匿名函数最后一行变化而变化。
(2)run函数的匿名函数里持有的是this,this == 调用者本身。

45、with内置函数特点:
(1)with函数返回类型,是根据匿名函数最后一行变化而变化。
(2)with函数的匿名函数里面持有的是this,this == 传入者本身
(3)with函数和run函数基本一样,只是使用方式不一样。with函数使用时候,需要将调用者传进去。


46、also内置函数:
(1)also函数返回类型,永远都是调用者本身。
(2)also函数的匿名函数里持有的是it,it == 调用者本身。

47、takeIf内置函数:
(1)takeIf最后返回调用者本身,还是null,取决于函数体里执行结果。以 name.takeIf{ true/ false } 为例。
(2)true:直接返回调用者本身
(3)false:直接返回null
(4)大部分情况下,都是 takeIf + 空合并操作符 一起使用。


48、takeUnless内置函数:
(1)takeUnless 和 takeIf 功能正好相反。
(2)takeUnless { false/ true },false:返回调用者本身;true:返回null。
(3)同样持有it,it == 调用者本身。

49、List创建与元素获取:
(1)可以listOf(“Derry”)方式创建List集合。
(2)getOrElse可以避免数组越界异常,若数组索引越界,返回{}里内容。
(3)getOrNull也可以避免数组越界异常,若集合索引越界,返回null。

50、可变List集合:
(1)可变集合,可以进行增、删的可变操作。
(2)可以通过mutableListOf()创建可变集合。
(3)可以通过toList()将可变集合转为不可变集合。


51、mutator函数:
(1)mutator:+=、-= 操作,可变集合,可以通过这两个运算符进行增删操作。
(2)removeIf,条件移除,如果条件满足,返回true,一旦true,就删除。如果条件直接写true,那么所有元素,逐个删除。

52、List集合遍历:
(1)集合遍历常用三种方式,for()、forEach()、forEachIndexed()。


53、解构语法、过滤元素:
(1)所谓解构,就是把集合的元素值,赋值给指定的变量。
(2)解构时候,可以用val,这样只读;也可以用var,这样解构后的元素可以更改。解构时候,()里变量顺序和集合顺序一一对应,变量数量随意,不用必须和集合元素数量一样。
(3)解构时,如果拒收某个元素,可以在对应变量位置,用_占据元素位置。下划线仅仅表示内部不接收赋值,不代表变量名。

54、set创建与元素获取:
(1)set集合不会出现重复元素,即使创建时候写了重复元素,内部也会覆盖掉。
(2)没有set[0]这样功能去取元素,需要使用elementAt()方式,和[]功能等价。
(3)使用list或者set集合,尽量使用安全方式取元素,防止越界崩溃。如:elementAtOrElse() {}、elementAtOrNull()。


55、可变set集合:
(1)和list集合一样,同样mutableSetOf()创建可变集合。

56、集合转换与快捷函数:
(1)List集合可以有重复元素。
(2)List转Set集合去重。
(3)List转Set,再转List后,得到的新的List,也是去重的。
(4)快捷函数去重—distinct,内部原理是转为可变的Set集合,之后再转为List集合。


57、数组类型:
(1)集合可以转为相应的数组,比如转为Char数组:toCharArray()。
(2)数组类型及创建:
IntArray -> intArrayOf()
DoubleArray -> doubleArrayOf()
LongArray -> longArrayOf()
ShortArray -> shortArrayOf()
ByteArray -> byteArrayOf()
FloatArray -> floatArrayOf()
BooleanArray -> booleanArrayOf()
Array<对象类型> -> arrayOf()

58、Map的创建:
(1)Map创建用mapOf(),唯一不同是,键值对传入时候,需要用to 方式,可以to(value)或者to value,不用逗号。
(2)另外,键值对传入也可以通过Pair()对象。

59、读取Map的值:
(1)方式一 [],找不到会返回null,这种方式和get()等价。
(2)方式二 getOrDefault()。
(3)方式三 getOrElse() {}。
(4)方式四 getValue(),这种方式找不到会崩溃。所以建议使用方式二、方式三。


60、遍历map:
(1)map在创建时候,可以不指定类型,这样可以存储任意类型的值。
(2)第一种方式遍历:使用forEach{},用默认it。it 代表每一个元素(K 和 V)。
(3)第二种方式遍历:使用forEach{},把默认it覆盖。自己定义两个变量,注意顺序是:前面是key,后面是value。
(4)第三种方式遍历:使用forEach{},自己定义变量方式,和第二种遍历区别是,这两个变量最好用()放到一起,因为key和value是一起的。
(5)第四种方式遍历:使用for,默认变量是entry,这个entry代表每一个元素(K 和 V)。



61、可变map集合:
(1)mutableMapOf()创建可变map集合。
(2)可变操作:+=、-=、[]、put()。其中,[]可以取值,也可以添加键值对。[]和put()等价。
(3)getOrPut()获取值:若map集合没有这个key,就先把这个key与默认值一起添加到集合中去,之后返回这个默认值。若map集合中有这个key,那么直接取出值。


62、定义类与field关键字:
(1)在类里定一个变量时候,这个变量背后也是转为private类型的。同时,不需要写这个变量的set()、get()方法,背后会自动生成。只有自己重写get()、set()方法时,才需要显示写这两个方法。
(2)field关键字:这个变量的set()、get()方法中,field代表这个变量。
(3)以KTBase51().name = "Kevin"为例,这里并不是直接拿到KTBase51类的name变量,然后赋值。而是,背后隐式代码,先new一个KTBase51类的对象,然后调用set()方法进行赋值。


63、计算属性与防范竞态条件:
(1)计算属性:val,变量只有get()函数,没有set()函数。
(2)防范竞态条件:当调用成员变量,这个变量可能为null,也可能为空值(“”),就必须采用防范竞态条件,这是KT编程的规范。



64、主构造函数:
(1)主构造函数特性:规范来说,都是增加_xxx的方式,并且都是临时的输入类型,不能直接用,需要接收下来,成为变量才能用。
(2)成员变量的get函数不允许私有化。
(3)val,只读的变量,不能修改的,不能set函数定义。


65、主构造函数里定义属性:
(1)主构造函数里,直接定义变量的类型,可读还是可更改,这样就不是临时输入类型变量,可以直接使用。


66、次构造函数:
(1)次构造函数,在类里,通过关键字constructor实现。
(2)次构造函数,必须调用主构造函数,否则不通过( : this(传主构造的参数))。
(3)次构造函数参数里不一定必须含有主构造的参数。
(4)次构造函数调用时机:先调用主构造函数,之后才调用次构造函数。
(5)为何必须调用主构造?为了主构造统一管理,为了更好的初始化设计。
(6)次构造函数的{}里,传入的参数可以直接使用。


67、构造函数中默认参数:
(1)主构造函数、次构造函数,在定义参数时候,都可以有默认值。
(2)主构造函数和次构造函数中,只要有一个构造函数的参数都有默认值,那么构造这个类时候,就可以不用传参数。
(3)当主次构造函数每个参数都有默认值时候,优先调用参数少的构造函数。
(4)当不传参数构造类时候,先在构造函数中寻找每个参数都有默认值的,之后符合条件里,选择参数最少的调用。


68、初始化块:
(1)初始化块,init()函数,当调用主构造函数时候,这个函数就会被调用。这个初始化块里,可以使用构造函数里临时输入的参数。


69、构造初始化顺序:
(1)第一步:生成主构造里声明变量类型的变量,如:生成 val sex: Char。
(2)第二步:类成员变量和init代码块级别一样,谁的顺序在前,先生成谁。
所以,init()用到的变量,必须在init()前面声明,否则报错。因为kotlin严格按照顺序执行
(3)第三步:生成init块里的细节。
(4)第四步:生成次构造的细节。


70、延时初始化lateinit:
(1)延时初始化关键字:lateinit。延时初始化的变量,只能定义var,不能定义val,否则后面初始化无法修改。
(2)没有初始化的变量,用就会崩溃,哪怕判null都不可以。
(3)使用它才初始化,就属于懒加载。


71、惰性初始化by lazy:
(1)by lazy 在使用时,自动加载的懒加载方式,之后使用;而lateinit 在使用时,是手动加载的懒加载方式,之后使用。



学习kotlin笔记之一相关推荐

  1. kotlin笔记第一阶段(变量语句函数)

    kotlin笔记第一阶段(变量&语句&函数) 笔记所在视频地址 02.Kotlin语言成为Android第一语言 03.Kotlin语言和JVM虚拟机 04.学Kotlin语言的重要性 ...

  2. python神经结构二层_《python深度学习》笔记---8.3、神经风格迁移

    <python深度学习>笔记---8.3.神经风格迁移 一.总结 一句话总结: 神经风格迁移是指将参考图像的风格应用于目标图像,同时保留目标图像的内容. 1."神经风格迁移是指将 ...

  3. tensorflow学习函数笔记

    为什么80%的码农都做不了架构师?>>>    [TensorFlow教程资源](https://my.oschina.net/u/3787228/blog/1794868](htt ...

  4. 为什么应该学习Kotlin

    Mark Platvoet是一名热衷于研究新的编程语言.技术和方法的Java和.NET开发者.最近,他为JetBrains推出的新语言Kotlin所吸引,并于近日撰文介绍了这门颇具生产力的语言. \\ ...

  5. CSDN技术主题月----“深度学习”代码笔记专栏

    from: CSDN技术主题月----"深度学习"代码笔记专栏 2016-09-13 nigelyq 技术专题 Hi,各位用户 CSDN技术主题月代码笔记专栏会每月在CODE博客为 ...

  6. 深度学习-最优化笔记

    深度学习-最优化笔记 作者:杜客 链接:https://zhuanlan.zhihu.com/p/21360434 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 译 ...

  7. 深度学习入门教程UFLDL学习实验笔记三:主成分分析PCA与白化whitening

     深度学习入门教程UFLDL学习实验笔记三:主成分分析PCA与白化whitening 主成分分析与白化是在做深度学习训练时最常见的两种预处理的方法,主成分分析是一种我们用的很多的降维的一种手段,通 ...

  8. 深度学习入门教程UFLDL学习实验笔记一:稀疏自编码器

     深度学习入门教程UFLDL学习实验笔记一:稀疏自编码器 UFLDL即(unsupervised feature learning & deep learning).这是斯坦福网站上的一篇 ...

  9. 学习Kotlin(八)其他技术

    推荐阅读: 学习Kotlin(一)为什么使用Kotlin 学习Kotlin(二)基本语法 学习Kotlin(三)类和接口 学习Kotlin(四)对象与泛型 学习Kotlin(五)函数与Lambda表达 ...

最新文章

  1. 推荐系统超级公开课报名!
  2. 零基础的前端开发初学者应如何系统地学习?
  3. Linux redis安装教程,Linux 下redis5.0.0安装教程详解
  4. OFBiz + Opentaps 目录管理 十三. 配置产品搜索
  5. 视频质量评估的新方式:VMAF百分位数
  6. 一个worker thread服务一个客户端
  7. HDU 1166 敌兵布阵 【线段树-点修改--计算区间和】
  8. Server Tomcat v8.0 Server at localhost failed to start.
  9. Docker基础-容器操作
  10. iOS 面试题 高级
  11. 分享一下最近微信域名防封的一些心得和经验,怎么才能做到域名防封呢
  12. 学而思网校python助手_学而思网校 - 主页
  13. 外国程序员和中国程序员的区别
  14. 鼠标没有唤醒计算机功能,怎么设置碰到鼠标电脑不会唤醒亮起来
  15. 李在福羽毛球教学经典视频汇总31集
  16. Matlab命令行乱码问题
  17. 房子,婚姻,名字,这三个关键词,你怎么看?
  18. jacoco不是奶茶,却像奶茶一样美味,不尝一下吗?
  19. Java学习路线图分享(含项目+面试提升)最全整理
  20. Windows Support Tools

热门文章

  1. IDEA配置.gitignore
  2. VS2010密钥(破解版可用)
  3. 数据结构-数组(Array)
  4. 互联网起源之发现电磁波
  5. Java访问OrientDB数据库实战教程
  6. 简单实用颈椎操,办公室里面的你有救啦
  7. poi导出excel时带有超链接
  8. 服务器安全设置Centos7 防火墙firewall与iptables
  9. Centos8防火墙设置
  10. antisamy java_XSS 简单理解之:AntiSamy