前言
通过前面几篇文章的学习,针对Kotlin已经有了一个比较全面的映像了。阅读代码应该能够理解相关的含义了。
这篇主要是学习一下常用的用法,复习知识的同时。了解Kotlin的一些语法的灵活使用。
- 前言
- 常用语法
- 1.给函数添加默认参数
- 2.创建只读的List和Map,创建支持修改的List和Map
- 3.过滤List
- 4.检测元素是否存在于集合之中
- 5.类型判断
- 6.遍历map/pair 型集合
- 7.使用区间
- 8.延迟属性
- 9.扩展函数
- 10.创建单例对象
- 11.If not null 缩写
- 12.If not null and else 缩写
- 13.if null执行一个语句
- 14.在集合之中创建null 值
- 15.在可能为空的集合中取第一元素
- 16.If not null 执行代码
- 17.映射可空值(如果非空的话)
- 18.返回When表达式
- 19.Try/catch 表达式
- 20.If表达式
- 21.返回类型为Unit的方法的Builder风格用法
- 22.单表达式函数
- 23.对一个对象实例调用多个方法(with)
- 24.配置对象的属性(apply)
- 25.获取输入流 InputStream
- 26.使用可空布尔
- 27.交换两个变量的值
- 28.TODO(): 将代码标记为不完整
常用语法
1.给函数添加默认参数
//我们在定义函数的时候,可以直接给它传默认参数。
fun test(a: Int = 0, b: String = "null") {
println(" a= $a ,b= $b")
}
fun main(array: Array<String>) {
test()
test(12)
test(20,"zinyan")
}
//输出:
a= 0 ,b= null
a= 12 ,b= null
a= 20 ,b= zinyan
2.创建只读的List和Map,创建支持修改的List和Map
var list = listOf("a", "b", "c", "d") //创建的List 只能读,不能写
list[0]="12" //错误
var map = mapOf("a" to 1, "b" to 2, "c" to 3) //创建的Map 只能读,不能写
map["a"] = 12 //错误
var list1 = mutableListOf("a", "b", "c", "d")//创建的List 可以读可以写
list1[0] = "A" //正常
var map1 = mutableMapOf("a" to 1, "b" to 2, "c" to 3)//创建的Map 可以读可以写
map1["a"] = 12 // 正常
3.过滤List
fun main(array: Array<String>) {
var indes = listOf<Int>(0, 1, 2, 3, 4, 5, 6, 7)
println(indes)
//得到集合中的x>0 的数据
val positives = indes.filter { x ->
x > 0
}
println(positives)
}
//输出:
[0, 1, 2, 3, 4, 5, 6, 7]
[1, 2, 3, 4, 5, 6, 7]
更精简的写法:
val positibew = indes.filter { it > 0 }
4.检测元素是否存在于集合之中
使用in
关键字
var titleArray = listOf("Z同学","Y同学","X同学","B同学")
if("Zinyan" in titleArray){
println("zinyan 在数组之中")
}else{
println("zinyan 不在数组之中")
}
if("Z同学" !in titleArray){
println("Z同学不在数组之中")
}else{
println("Z同学在数组之中")
}
5.类型判断
when (x) {
is Foo ->{
//写你的业务
}
is Bar ->{
//写你的业务
}
else ->{
//写你的业务
}
}
6.遍历map/pair 型集合
fun main(array: Array<String>) {
var map = mapOf<String,Any>("name" to "Z同学","url" to "zinyan.com")
for((k,v) in map){
println("$k -> $v")
}
}
//输出:
name -> Z同学
url -> zinyan.com
备注: 上面的K
和V
可以改成任意名字。
7.使用区间
for(i in 1..100){//闭区间,包含100。 参数从1到100
println(i)
}
for(i in 1 until 100){ //半开区间,不包含100,参数从1到99
println(i)
}
for(i in 2..10 step 2){ //闭区间,步长为2 ,参数为:2,4,6,8,10
println(i)
}
for(i in 10 downTo 1){ //闭区间,参数从10 到1,倒叙
println(i)
}
var i =1
if(i in 1..10){ //检测参数i 是否在闭区间1到10 里面。
println("包含")
}
8.延迟属性
val p: String by lazy {
//计算该字符串
print("sss")
"P的值"
}
9.扩展函数
class A{}
fun A.kuozan(){
println("这是一个扩展")
}
fun main(array: Array<String>) {
var a = A()
a.kuozan()
}
//输出
这是一个扩展
10.创建单例对象
object Resource{
val name="Z同学"
}
fun main(array: Array<String>) {
println(Resource.name)
}
//输出
Z同学
11.If not null 缩写
//得到一个文件夹集合对象
val files = File("Test").listFiles()
//因为可能为null 所以添加?问号 这样不会因为空值崩溃
println(files?.size)
12.If not null and else 缩写
//得到一个文件夹集合对象
val files = File("Test").listFiles()
//如果files是null的,那么就返回0 ,不是空就返回size值
println(files?.size?:0)
13.if null执行一个语句
fun main(array: Array<String>) {
val values= mapOf<String,String>("url" to "zinyan.com","name" to "Z同学")
val email = values["email"]?: throw IllegalStateException("Email is missing! ")
}
执行结果 会返回IllegalStateException 错误。 因为关键字: ?:
14.在集合之中创建null 值
只需要在String
后面添加?
即可
val values = listOf<String?>("zinyan.com", "name", "Null", null, "哈哈")
15.在可能为空的集合中取第一元素
如果集合之中有null。那么可以取到值的时候,将null赋值为其他情况
val values = listOf<String?>(null, "name", "Null", null, "哈哈")
//获取集合的开头值。 只有list是支持null的情况下才有下面的方法。
val mainEmail = values.firstOrNull() ?: "有空值"
println(mainEmail)
//输出:
有空值
16.If not null 执行代码
只有当参数不是null 的时候,才会执行。 可以规避掉null 值的情况
fun main(array: Array<String>) {
var value: String? = null
value?.let {
//代码如果不为空 就会执行
println("value= $value")
}
value = "Zinyan"
value?.let {
//代码如果不为空 就会执行
println("value= $value")
}
}
//输出:
value= Zinyan
17.映射可空值(如果非空的话)
fun transformValue(aa: String) = aa
fun main(array: Array<String>) {
val values: String? = "结果值"
val mapped = values?.let {
transformValue(it)
} ?: "其他结果"
}
18.返回When表达式
//传参String,返回值Int
fun transform(color:String):Int{
return when(color){
"RED" ->0
"BLUE" ->1
"GREEN" ->2
else ->-1
}
}
fun main(array: Array<String>) {
var values = transform("RED")
}
19.Try/catch 表达式
fun test() {
val result = try {
count()
} catch (e: Exception) {
throw IllegalStateException(e)
}
}
20.If表达式
fun test(temp: Int) {
val result = if (temp == 1) {
"one"
} else if (temp == 2) {
"two"
} else {
"other"
}
}
21.返回类型为Unit的方法的Builder风格用法
fun arrayOfMinusOnes(size: Int): IntArray {
return IntArray(size).apply {
fill(-1)
}
}
fun main(array: Array<String>) {
val ss: IntArray = arrayOfMinusOnes(10)
println(ss.toString())
}
//输出: 返回内存地址
[I@6f94fa3e
22.单表达式函数
fun theAnswer()=23
两种表达式是等价的,只是第一种会更精简而已
fun theAnswer():Int{
return 23
}
这种表达式除了可以直接与返回参数使用外,还能与其他函数一起使用。例如When表达式。if表达式。等等
fun transForm(color: String): Int = when (color) {
"Red" -> 0
"Green" -> 1
else -> -1
}
23.对一个对象实例调用多个方法(with)
class Turtle {
fun penDown() {}
fun penUp() {}
fun turn(degrees: Double) {}
fun forward(pixels: Double) {}
}
fun main(array: Array<String>) {
val turtle = Turtle()
with(turtle) {
penDown()
for (i in 1..4) {
forward(100.0)
turn(90.0)
}
penUp()
}
}
将会在with块里面按照顺序执行上面的代码
24.配置对象的属性(apply)
class Test {
var length: Int = 0
var breadth: Int = 0
var color: Int = 0
override fun toString(): String {
return "$length+$breadth+$color"
}
}
fun main(array: Array<String>) {
val temp = Test().apply {
length = 4
breadth = 5
color = 0xFAFAFA
}
println(temp.toString())
}
//输出
4+5+16448250
25.获取输入流 InputStream
//通过InputStream 获取reader 数据流
val stream = Files.newInputStream(Paths.get("/some/file.txt"))
stream.buffered().reader().use { reader ->
println(reader.readText())
}
26.使用可空布尔
fun main(array: Array<String>) {
val b: Boolean? = null
if(b ==true){
println("b 是true")
}else{
println("b 是false 或者 null")
}
}
//输出
b 是false 或者 null
27.交换两个变量的值
var a = 1
var b = 2
println("b 的值 $b")
println("a 的值 $a")
a = b.also { b = a }
println("b 的值 $b")
println("a 的值 $a")
输出:
b 的值 2
a 的值 1
b 的值 1
a 的值 2
28.TODO(): 将代码标记为不完整
Kotlin的标准库止中有一个TODO()函数。 这个函数总是抛出一个NotImplementedError
返回值类型为Nothing
,因此无论预期类型是什么都可以使用它,还有一个接受原因参数的重载。
fun calcTaxes(): BigDecimal = TODO("Waiting for feedback from accounting")
评论区