想了很久,一直在想怎么记录笔记最高效,最后感觉还是结合代码比较好。

1.整数的遍历,in表示是否在一个区间内,!in表示不再某个区间内

fun fizzBuzz(i:Int) = when {

i%15==0->"FizzBuzz "

i%3==0->"Fizz "

i%5==0->"Buzz "

else ->"$i "

}

>>>for(i in 100 downTo 1 step 2) {print(fizzBuzz(i))}

2.类似java,Pair的用法val list = arrayListOf("10", "11", "1001")

for((index, element) in list.withIndex()) {println("$index: $element")}

3.类似java中的.class

>>>println(set.javaClass)

***4.给别人的类添加方法:扩展函数和属性,注意包名要对

package strings

fun:String.lastChar():Char = this.get(this.length()-1)

接收者类型                    接收者对象

可以像调用类的普通成员函数一样去调用这个函数

>>>println("Kotlin".lastChar())

***扩展函数不能访问私有的或者是受保护的成员

5.导入和扩展函数

对于你定义的一个扩展函数,它不会自动地在整个项目范围内生效。相反,如果你要使用它,需要进行导入,(果然不出我所料),就像其他任何的类或者函数一样。Kotlin允许用和导入类一样的语法来导入单个的函数

import strings.lastChar或者import strings.*

val c ="Kotlin".lastChar()

用as来修改导入的类或者函数名称

import strings.lastChar as last

val c = "Kotlin".last()

6.不可重写的扩展函数

扩展函数并不是类的一部分,它是声明在类之外的。尽管可以给积累和子类都分别定义一个同名的扩展函数,此时需要调用时,会按照类的定义类型来判定到底会调用哪个函数。

fun View.showoff() = println("I'm a View!")

fun Button.showOff() = println("I'm a button!")

>>>val view:View = Button()

>>view.showOff()

I'm a View!

注意:扩展函数和成员函数同时存在时,成员函数的优先级要高于扩展函数。

扩展函数相当于静态函数,所以不存在重写的问题。

7.字符串的分割split方法

按照正则表达式来进行分割

>>>println("12.345-6.A".split("\\.|-".toRegex)))

[12,235,6,A]

Kotlin中的split扩展函数的其他重载支持任意数量的纯文本字符串分隔符

>>>println("12.345-6.A".split(".", "-"))

输出结果相同

8.正则表达式和三重引用的字符串

fun parsePath(path:String) {

fun parsePath(path:String) {val directory = path.substringBeforeLast("/")val fullName = path.substringAfterLast("/")val fileName = fullName.substringBeforeLast(".")val extension = fullName.substringAfterLast(".")println("Dir: $directory, name: $fileName, ext: $extension")
}
fun parsePath(path:String) {val regex = """(.+)/(.+)\.(.+)""".toRegex()val matchResult = regex.matchEntire(path)if(matchResult != null){val (directory, filename, extension) = matchResult.destructured
        println("")}
}

正则表达式写在一个三重引号的字符串中。在这样的字符串中,不需要对任何字符进行转义。

9.提取逻辑到扩展函数

class User(val id:Int, val name:String, val address:String)fun User.validateBeforeSvae() {fun validate(value :String, fieldName:String) {if(value.isEmpty()) {throw IllegalArgumentException("Can't save user $id:empty $fieldName")}}validate(name, "name")validate(address, "address")
}

10.Kotlin的声明默认是final和public的。嵌套的类默认并不是内部类:他们并没有包含对其外部类的隐式引用。

Kotlin编译器能够生成有用的方法来便面荣誉。将一个类声明成data类可以让编译器为这个类生成若干标准方法。

11.kotlin接口可以带默认实现,在一个类实现了两个接口,并且这两个接口拥有同一个名称的方法时,调用这个方法时,“任何一个都不会被调用”,需要显式地实现对应的方法。

override fun showOff() {super<A>.showOff()super<B>.showOff()
}

12.如果想创建一个类的子类,需要使用open修饰符来标示这个类。

注意:脆弱的基类问题,因为基类代码的修改不再符合在其子类中的假设。如果类没有提供子类应该怎么实现的明确规则(那些方法选用被重写及如何重写),当事人可能会有按基类作者预期之外的方式来重写方法的风险。因为不可能分析所有的子类,这种情况写基类是如此的脆弱,任何修改都有可能导致子类出现语气之外的行为改变。

13.internal可见性的优势在于它提供了对米小实现细节的真正封装。使用java时,这种封装很容易被破坏,因为外部代码可以将类定义到与你代码相同的包中,从而得到访问你的包私有声明的权限。

14.密封类:定义受限的类继承结构

使用when的时候,如果你添加了一个信息的子类,编译器并不能发现有地方改变了,如果你忘了添加一个新分支,就会选择默认的选项,这有可能导致潜在的bug。

kotlin解决方案,sealed类。

sealed class Expr {class Num(Val value:Int) :Expr()class Sum(Val left:Expr, val right:Expr):Expr()
}fun eval(e:Expr) :Int = when(e) {is Expr.Num -> e.valueis Expr.Sum -> eval(e.right) + eval(e.left)}

sealed修饰符隐含的这个类是一个open类

Kotlin1.1解除了这些限制并允许在同一文件的任意位置定义子类

欲知后事如何,请听下回分解,enjoy yourselves!

Kotlin学习 PART 2:kotlin基础相关推荐

  1. Kotlin学习之起始篇—基础语法

    Kotlin学习之起始篇-基础语法 Kotlin被Android接纳为官方语言已经一年多了,现在才开始学习,实在惭愧.希望能一点点进步,到最后能完全用Kotlin开发app.废话就不多说了.Let's ...

  2. Kotlin学习九:Kotlin中的“==”和“===”

    说明 在java中我们经常遇到的面试问题两个String的''和'equals'比较的结果,这就是考验大家对String关于''和'equals'的理解.在kotlin中出现了一种=的比较两个对象的运 ...

  3. Kotlin学习之ListView

    Kotlin学习之ListView Kotlin学习之ListView 前言 一.创建xml 二.创建ListView的adapter 三.在mainactivity中设置listview的adapt ...

  4. Kotlin学习笔记 第一章开始 第二章 基础

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 本系列为参考Kotlin中文文档 https://download.csdn.net/dow ...

  5. Kotlin学习笔记(1)-- 基础语法

    文章目录 Kotlin学习笔记(1)-- 基础语法 输出 语法 代码 输出 可读可改(var) 语法 代码 输出 内置数据类型 只读变量(val) 类型推断 编译时常量 语法 代码 输出 引用类型 r ...

  6. Kotlin 学习笔记(四)—— 协程的基础知识,面试官的最爱了~

    又是一个月没见了,坚持永远是世上最难的事情,但,往往难事才会有更大的收获.与君共勉~ 前段时间一直在学习 Compose,所以导致 Kotlin 笔记系列搁置了好久.一方面是因为 Compose 的学 ...

  7. Kotlin学习(一):Kotlin基础知识

    Kotlin学习(一):Kotlin基础知识 定义变量常量 在Kotlin中,定义变量时有以下几点与java不同: 位置不同:在 Kotlin 中,数据类型要放到变量后面,并且用冒号(:)分隔,这正好 ...

  8. Kotlin 学习笔记(八)—— Kotlin类与对象之接口

    Kotlin 学习笔记(八)-- Kotlin类与对象之接口 Kotlin学习笔记系列教程 Kotlin 学习笔记(一)-- 概述.学习曲线.开发工具.参考资料 Kotlin 学习笔记(二)-- 基础 ...

  9. Kotlin学习笔记(3)- 语法

    系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正.如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步!kotlin学习笔记系列首发简书和CSDN Kotlin学习笔记(1)- 环 ...

  10. kotlin学习目录

    目录 kotlin学习之基础(一) kotlin学习之函数(二) kotlin学习之类(三) kotlin学习之类的扩展(四) kotlin学习之密封类(五) kotlin学习之嵌套类和内部类(六) ...

最新文章

  1. 腾讯首次发布 AI 白皮书讲了什么?
  2. Swift3.0语言教程使用Unicode范式标准化获取字符串
  3. JavaScript对象、原型、原型链知识总结思维导图
  4. html5+游戏+广告,给html5 游戏添加admob广告挣钱盈利
  5. 城乡投票源码php_响应式投票系统(支持微信、手机) php版 v3.2
  6. 【Python】画图海龟
  7. android自定义横向时间轴,Android自定义时间轴的实现过程
  8. 资源分享 | 敬伟 PS 教程 ABCD 四套全集
  9. 有哪些实用的文字转语音工具值得推荐?收藏了
  10. R语言:逆变换法生成随机数
  11. 微信小程序云开发上传图片和删除图片
  12. 这应该是第一篇写拼多多商业模式的文章吧
  13. 【转】从程序员到项目经理--西西吹雪
  14. 《这就是软件工程师》读书笔记
  15. 使用putty等ssh工具第一次远程登录树莓派,填默认账号密码pi,raspberry,报错:Access denied
  16. 秋招季,写份亮眼的求职简历
  17. 游戏网站的设计与实现(HTML和CSS实现魔兽世界官网)
  18. css有意思的那些事儿
  19. 《惢客创业日记》2019.05.12(周日)《惢客》018 目前的市场现状是什么样的?(九)
  20. 罗德里格斯(Rodrigues)旋转向量转旋转矩阵

热门文章

  1. python中字符串中文乱码_[python] 中文乱码问题
  2. gdb coredump
  3. 切换器黑屏_机房的KVM切换器是什么,故障如何解决?
  4. mysql dbcollat_Mysql Server 层混杂信息字典表 | 全方位认识 information_schem(四)
  5. java接口注入对象的意义_Java Web系列:Spring依赖注入基础
  6. 属于哪种虚拟化类型_经络淤堵,疲乏无力?有3种疲劳类型,你属于哪种,快来自测一下...
  7. 服务器内存条位置,服务器内存条
  8. l开头的英文车标是什么车_L开头的英文车标叫什么车
  9. jdbc插入数据_JMeter数据库测试计划
  10. java线程锁的作用,大厂面经合集