大家好,关于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基础语法的介绍到此结束,希望对大家有所帮助。