# Kotlin
变量和函数
变量
-
如果代码要定义一个变量,需要在变量前面声明这个变量的类型,比如
-
而在中定义一个变量,只允许在变量前声明两种关键字:val 和var
-
val (value的简写)用来声明一个不可变的量,这种变量在初始赋值之后就再也不能重新赋值,对应Java中 final 变量 -
var (variable的简写)用来声明一个可变的变量,这种变量在初始赋值之后仍然可以再被重新赋值,对 Java中的非final 变量 -
val a = 10
var b = "杨浔"
-
可以看到在声明变量时,并没有为了限定类型,那么他的类型时怎么确定的呢?
-
但是这种类型推导机制并不是万能的,在一些延迟赋值的情况下,Kotlin就无法自动推导他的类型了 这时候就需要显式的声明变量类型才行,语法如下 -
val a : Int = 100
- 可以看到,此时的是首字母大写的,而Java中的首字母是小写的,这是因为Kotlin已经完全抛弃了Java
中的基本数据类型,全部使用了对象数据类型,如变成了一个类,拥有自己的方法和继承结构 -
Java和Kotlin数据类型对照表
-
Java基本数据类型 | Kotlin对象数据类型 | 数据类型说明 |
---|
int | Int | 整型 | long | Long | 长整型 | short | Short | 短整型 | float | Float | 单精度浮点型 | double | Double | 双精度浮点型 | boolean | Boolean | 布尔型 | char | Char | 字符型 | byte | Byte | 字节型 | | | |
-
为什么要使用val 关键字? -
为了解决Java中final关键字没有被合理使用的问题
- 在Java中,除非你在主动在变量前声明了final关键字,否则这个变量就是可变的。然而这并不
一件好事,当项目变得越来越复杂,参与开发的人越来越多时,你永远不知道一个可变的便令 在什么时候被谁给修改了,即使他原本不应该被修改。这就经常会导致出现一些很难排查的 题。因此,一个好的变成习惯是,除非一个变量名取而允许被修改,否则都应该给他加上final 键字 -
什么使用使用什么时候使用?
- 永远优先使用声明一个变量,而当无法满足你的需求时再使用
函数
-
语法
-
语法糖,当一个函数只有一行时,Kotlin允许我们不必写函数体,可以直接将唯一的一行代码写在函数定义 尾部,中间用等号连接即可
-
fun largerNum(num1 : Int, num2 : Int) : Int {
return max(param1, num2)
}
====>
fun largerNum(num1 : Int, num2 : Int) : Int = max(num1, num2)
-
使用这种语法,return关键字也可以省略了,等号足以表达返回值的意思,另外,因为Kotlin优秀的 型推导机制,所以该函数可以再化简为 -
fun largerNum(num1 : Int, num2 : Int) = max(num1, num2)
程序的逻辑控制
if条件控制
-
Kotlin中的if 语句和Java中的if 语句几乎没有任何区别
-
Kotlin中的if 语句相比于Java有一个额外功能——他是可以有返回值的,返回值就是语句每一个条件中最后 行代码的返回值,因此上面的代码可以简化为
-
可以看到temp是一个多余的变量,故可以再次修改
-
这样看的话,return后面可以看作是一句话,故可以再次修改
-
fun largerNum(num1 : Int, num2 : Int) = if(num1 > num2){
num1
}else{
num2
}
周知,大括号里有一句以不写大括号=============>
fun largerNum(num1 : Int, num2 : Int) = if(num1 > num2) num1 else num2
when条件语句
-
when 语句有点类似Java中的switch 语句,但他又远比语句强大得多
switch 有着种种限制,比如他只能传入整型或短于整型或者字符串变量作为条件,其次每一个case条件都要 最后主动加上一个break,否则执行完当前case之后会一次执行下面的case -
下面看一个实例
-
当判断条件很多时,使用if 就会显得代码很冗余,这时可以使用when
-
因为和if 语句一样,也是可以有返回值的,所以仍旧可以使用单行代码函数的语法糖 -
语句允许传入一个任意类型的参数,然后可以在when的结构提中定义一系列的条件,格式是
-
匹配值 -> {执行逻辑}
-
当代码只有一行时,{}可以省略 -
除了精确匹配之外,语句还允许进行类型匹配
-
fun checkNumber(num : Number){
when(num){
is Int -> println("number is Int")
is Double -> println("number is Double")
lse -> println("number not support")
}
}
-
上述代码中,关键字是类型匹配的核心,它相当于Java中的instanceof 关键字,由于checkNumber() 函数接受一个Number 类型的参数,这是Kotlin 内置的一个抽象类,像Int、Float、Double 等与数字相关的类都是他的子类,所以这里就可以使用了类型匹配来判断传入的参数到底属于什么类型 -
when 语句的基本用法就这些,但其实when 语句还有一种不带参数的用法
循环语句
-
熟悉Java的人都晓得,Java中主要有两种循环语句:while 循环和for 循环。Kotlin中也提供了while 和for 循环,其中while 循环不论是语法还是使用技巧上都和Java一样,故不讨论 -
Kotlin在for 循环方面做了很大幅度的修改,Java中最常用的for-i 循环在Kotlin直接被舍弃,而Java中另一种for-each 循环则被Kotlin进行了大幅度的增强,变成了for-in 循环 -
在此之前,先普及一个区间的概念
-
val range = 0..10
-
上述代码表示创建了一个0到10的区间,并且两端都是闭区间,这意味着0到10这两个端点都是包含在区间中的,用数学的方式表示就是[0,10] -
其中,.. 是创建两端闭区间的关键字,在.. 两边置顶区间的左右端点就可以创建一个区间了 -
有了区间后就可以通过for-in 循环来遍历这个区间
-
在很多情况下,双端闭区间却不如单端闭区间好用,比如数组的下标是从0开始,一个长度为10的数组,他的下标区间范围是0到9,因此左闭右开的区间更加常用,Kotlin中可以使用until 关键字来创建一个左闭右开的区间
-
默认情况下,for-in 循环每次执行循环时会在区间回味内递增1,相当于Java for-i 循环中i++ 的效果,而如果你想要跳过其中的一些元素,可以使用step 关键字:
-
上述两种都是区间左端必须小于区间右端,也就是这两种关键字创建的都是一个升序的区间,如果想创建一个降序的区间,可以使用downTo 关键字
面向对象编程
- 什么是面向对象编程?
- 先将实物封装成具体的类,然后将事物所有的属性和能力分别定义成类中的字段和函数,接下来对类进行实例化,再根据具体的变成需求调用类中的字段和方法即可
类与对象
继承与构造函数
接口
都一样,随缘
可见性修饰
修饰符 | Java | Kotlin |
---|
public | 所有类可见 | 所有类可见(默认) | private | 当前类可见 | 当前类可见 | protected | 当前类、子类、同一包路径下的类可见 | 当前类、子类可见 | default | 同一包路径下的类可见(默认) | 无 | internal | 无 | 同一模块中的类可见 | | | |
数据类与单例类
Lambda编程
-
集合的创建和遍历
-
List
-
# 不可变集合
val list = listOf("Apple", "Banana", "Orange")
for(fruit in list){
println(fruit)
}
#可变集合
val list = mutableListOf("Apple", "Banana", "Orange")
list.add( "Pear")
for(fruit in list){
println(fruit)
}
-
Set
#不可变集合
val set = setOf("Apple", "Banana", "Orange")
for(fruit in set){
println(fruit)
}
#可变集合
val set = mutableListOf("Apple", "Banana", "Orange")
list.add( "Pear")
for(fruit in set){
println(fruit)
}
-
Map
-
#存数据
map["Apple"] = 1
#取数据
val number = map["Apple"]
#不可变集合
val map = mapOf("Apple" to 1, "Banana" to 2)
#可变集合
val map = mutableMapOf("Apple" to 1, "Banana" to 2)
map["Pear"] = 3
for((fruit, number) in map){
println("fruit is" + fruit + ",number is " + number)
}
-
集合的函数式API
-
Java函数式API的使用
空指针检查
补充
字符串内嵌表达式
函数的参数默认值
fun printParams(num : Int, str : String = "hello")
printParams(123)
fun printParams(num : Int = 100, str : String = "hello")
printParams(str = "world")
|