kotlin函数(kotlin基础语法)

admin 495 0

大家好,关于kotlin函数很多朋友都还不太明白,今天小编就来为大家分享关于kotlin基础语法的知识,希望对各位有所帮助!

一、每天学一点 Kotlin -- 函数:泛型函数

----《第一季Kotlin崛起:次世代Android开发》学习笔记

总目录:每天学一点 Kotlin----目录

上一篇:每天学一点 Kotlin--函数:标准库函数

下一篇:每天学一点 Kotlin--函数:类型层级

1.1泛型是指“通用的类型”,在面向对象中会经常用到。比如写了一个函数,然后换一下参数类型和返回值类型又要写一次函数体不变的函数。这时候泛型就派上用场了。使用泛型就可以让函数接受任何类型的参数。

1.2要使用泛型,就要在关键字 fun后面加上泛型占位符,在参数中使用这个占位符。举个栗子:

二、kotlin之构造函数(constructor)

1、个人博客:haichenyi.com。感谢关注

2、  java中的构造函数是与类名相同即可,kotlin里面的构造函数是用constructor关键字表示。

3、  kotlin里面的构造函数分为主构造函数和次构造函数。主构造函数只能有一个,次构造函数个数不限制,可以有一个或者多个

4、  啥是主构造方法?啥是次构造方法呢?

5、  我们可以看到主构造方法是没有方法体的,那么,我们需要初始化的数据应该放到哪呢?kotlin提供了init方法,给我们初始化数据。

6、  那么,问题来了,次构造方法有方法体,会执行这个init模块吗?

7、结论:不管是什么构造方法,先执行init模块逻辑,后执行构造方法的逻辑

8、  简单的说一下继承,this和super两个关键字,跟java差不多;

9、  this是调用自己的,super是调用父类的

10、  类BBB继承类AAA,其中BBB分别有一个参数的构造方法和两个参数的构造方法;一个参数的构造方法用的this关键字调用自己的两个参数的构造;而两个参数的构造方法用的super关键字调用的父类两个参数的构造方法;这里控制台打印的数据:

11、说到了这个类,讲一下怎么重写属性的set/get方法

12、  这里一个person类,里面有三个属性:name,age,address;在name和age下面分别写了set,get方法,address没写。

13、  这里,我就只重写了name和age的set,get方法,没有重写address的set,get方法

14、  这里,我再存名字的时候在名字的后面加上了www,在获取的时候又加上了zzz,也就是说,如果你这里name传的是"小王",那么你用get方法取到的name的值应该是"小王wwwzzz"

15、  存age的时候,自己分析一下吧,很简单。

三、Kotlin 基础语法

1、 kotlin源文件不需要相匹配的目录和包,源文件可以放在任何文件目录。

2、以上例中 test()的全名是 com.runoob.main.test、Runoob的全名是 com.runoob.main.Runoob。

3、如果没有指定包,默认为 default包。

4、有多个包会默认导入到每个 Kotlin文件中:

5、函数定义使用关键字 fun,参数格式为:参数:类型

6、表达式作为函数体,返回类型自动推断:

7、无返回值的函数(类似Java中的void):

8、函数的变长参数可以用 vararg关键字进行标识:

9、不可变变量定义:val关键字,只能赋值一次的变量(类似Java中final修饰的变量)

10、常量与变量都可以没有初始化值,但是在引用前必须初始化

11、 Kotlin支持单行和多行注释,实例如下:

12、与 Java不同, Kotlin中的块注释允许嵌套。

13、${varName.fun()}表示变量的方法返回值:

14、当 str中的字符串内容不是一个整数时,返回 null:

15、以下实例演示如何使用一个返回值可为 null的函数:

16、我们可以使用 is运算符检测一个表达式是否某类型的一个实例(类似于Java中的instanceof关键字)。

17、区间表达式由具有操作符形式..的 rangeTo函数辅以 in和!in形成。

18、区间是为任何可比较类型定义的,但对于整型原生类型,它有一个优化的实现。以下是使用区间的一些示例:

四、Kotlin语言(十二):Channel

1、(1) Channel翻译过来为通道或者管道,实际上就是个队列,是一个面向多协程之间数据传输的 BlockQueue,用于协程间通信;

2、(2) Channel使用 send和 receive两个方法往管道里面写入和读取数据,这两个方法是非阻塞的挂起函数;

3、(3) Channel是热流,不管有没有订阅者,上游都会发射数据。

4、(1)我们发现,这种方式,实际上是我们一直在等待读取 Channel中的数据,只要有数据到了,就会被读取到;

5、(2)最后一行 Done!没有打印出来,表示程序没有结束,一直处于等待读取数据的状态。

6、(1)调用 close方法就像向通道发送了一个特殊的关闭指令,这个迭代停止,说明关闭指令已经被接收了;

7、(2)这里能够保证所有先前发送出去的元素都能在通道关闭前被接收到;

8、(3)调用了 close会立即停止接受新元素, isClosedForSend会立即返回 true,而由于 Channel缓冲区的存在,这时候可能还有一些元素没有被处理完,所以要等所有的元素都被读取之后 isClosedForReceive才会返回 true。

9、(1) Channel是一个接口,它继承了 SendChannel和 ReceiveChannel两个接口

10、(2) SendChannel提供了发射数据的功能,有如下重点接口:

11、  - send是一个挂起函数,将指定的元素发送到此通道,在该通道的缓冲区已满或不存在时挂起调用者。如果通道已经关闭,调用发送时会抛出异常;

12、  - trySend如果不违反其容量限制,则立即将指定元素添加到此通道,并返回成功。否则,返回失败或关闭;

13、  - close关闭通道;

14、  - isClosedForSend判断通道是否已经关闭,如果关闭,调用 send会引发异常。

15、(3) ReceiveChannel提供了接收数据的功能,有如下重点接口:

16、  - receive如果此通道不为空,则从中检索并删除元素;如果通道为空,则挂起调用者;如果通道未接收而关闭,则引发 ClosedReceiveChannel异常;

17、  - tryReceive如果此通道不为空,则从中检索并删除元素,返回成功结果;如果通道为空,则返回失败结果;如果通道关闭,则返回关闭结果;

18、  - receiveCatching如果此通道不为空,则从中检索并删除元素,返回成功结果;如果通道为空,则返回失败结果;如果通道关闭,则返回关闭的原因;

19、  - isEmpty判断通道是否为空;

20、  - isClosedForReceive判断通道是否已经关闭,如果关闭,调用 receive会引发异常;

21、  - cancel(cause: CancellationException?= null)以可选原因取消接收此频道的剩余元素,此函数用于关闭通道并从中删除所有缓冲发送的元素;

22、  - iterator()返回通道的迭代器。

23、  - Rendezvous channel 0尺寸 buffer(默认类型)

24、  - Unlimited channel无限元素, send不被挂起

25、  - Buffered channel指定大小,满了之后 send挂起

26、  - Conflated channel新元素会覆盖旧元素, receiver只会得到最新元素, send永不挂起

27、(1)通过 produce这个方法启动一个生产者协程,并返回一个 ReceiveChannel,其他协程就可以拿着这个 Channel来接收数据了;

28、(2)通过 actor可以用来构建一个消费者协程,并返回一个 SendChannel,其他协程就可以拿着这个 Channel来发送数据了。

29、(1) BroadcastChannel被标记为过时了,请使用 SharedFlow和 StateFlow替代它;

30、(2)1中例子提到一对多的情形,从数据处理本身来讲,有多个接收端的时候,同一个元素只会被一个接收端读到;而 BroadcastChannel则不然,多个接收端不存在互斥现象。

31、使用 broadcast()扩展函数可以将 Channel转换成 BroadcastChannel

关于kotlin函数,kotlin基础语法的介绍到此结束,希望对大家有所帮助。