文章目录
- 1.变量和函数
-
- [1.1 变量](#1.1 变量)
- [1.2 函数](#1.2 函数)
- 2.程序的逻辑控制
-
- [2.1 if条件语句](#2.1 if条件语句)
- [2.1 when条件语句](#2.1 when条件语句)
- 2.2for循环
- [3 类与对象](#3 类与对象)
-
- 3.1构造函数
- [3.2 java和Kotlin函数可见性修饰符对照表](#3.2 java和Kotlin函数可见性修饰符对照表)
- 4.数据类与单例类
- [5 Lambda编程](#5 Lambda编程)
-
- [5.1 listof()函数](#5.1 listof()函数)
- [5.2 SetOf()](#5.2 SetOf())
- 5.3Map集合
- [5.4 集合的函数式API](#5.4 集合的函数式API)
- [5.4 可空类型系统](#5.4 可空类型系统)
- 6.Kotlin转换为Java
1.变量和函数
1.1 变量
val用来声明一个不可变的变量,对应java中的final
var用来声明一个可变的变量
每一行代码的结尾不用加分号
自动推导变量的类型val a = 10
,但是在延迟赋值的时候,需要显示声明变量类型:val a :Int = 10
在Kotlin中,延迟赋值通常是通过使用 lazy 委托属性来实现的。lazy 委托属性允许你延迟一个值的初始化,直到第一次访问该属性时才进行计算。这对于那些计算开销较大或依赖于某些初始化步骤完成后才可获得的属性特别有用。
Kotlin没有基本数据类型,全部使用对象数据类型
1.2 函数
kotlin
fun methodName(param1:Int,param2:Int):Int{
return 0;
}
2.程序的逻辑控制
2.1 if条件语句
if相比于java有一个额外的功能,它可以有返回值,返回值是if语句每一个条件中最后一行代码的返回值
传统的写法:
kotlin
fun largerNumber(num1:Int,num2:Int):Int{
var value = 0
if(num1 > num2){
value = num1
}else{
value = num2
}
return value
}
if语句中返回value
kotlin
fun largeNumber(num1:Int,num2:Int):Int{
val value = if(num1 > num2){
num1
}else{
num2
}
return value
}
继续精简
kotlin
fun largeNumber(num1:Int,num2:Int):Int{
return if(num1 > num2){
num1
}else{
num2
}
}
语法糖:当一个函数只有一行代码时,可以省略函数体部分,直接将这一行代码使用等号串联在函数定义的尾部
kotlin
fun largeNumber(num1:Int,num2:Int) = if(num1 > num2) num1 else num2
太优雅了~
2.1 when条件语句
Kotlin中的when语句有点类似于java中的Switch语句。when相对于java中的Switch增强:
-
when允许传入一个任意类型的参数,when的结构体中定义了一系列的条件
匹配值 -> {执行逻辑} 只有一行代码时,{}可以省略
-
支持类型匹配
is相当于java中的instanceof关键字
kotlin
fun checkNumber(num:Number){
when(num){
is Int -> println("..")
is Double -> println("...")
else -> println("....")
}
}
Kotlin中判断字符串或者对象相等可以直接使用 == 关键字
2.2for循环
- 舍弃了for-i循环,使用for-in循环
- 区间概念
val range= 0..10
等价于[0,10], ...是创建区间的关键字
kotlin
fun main(){
for(i in 0..10){
println(i)
}
}
- 用单端闭区间多,尤其是左闭右开区间,int[10] 实际上区间范围是0到9。
- Kotlin使用until关键字来创建一个左闭右开的区间
val range = 0 until 10
- step关键字,循环中每次循环后i自增的大小
- 降序区间使用downTo关键字
for(i in downTo 1)
创建了[10,1]的降序区间
3 类与对象
- 实例化对象不需要new关键字
- Kotlin中任何一个非抽象类默认都是不可以被继承的,相当于java中给类声明了final关键字
- open关键字使得类可以被继承
kotlin
open class Person{
...
}
- 继承关键字是一个:,而不思extends;父类后面还要加上一对括号。下方代码是student类继承了Person类
kotlin
class Student:Person(){
var sno = ""
var grade = 0
}
3.1构造函数
- 主构造函数,默认不带参数,也可以显式的指明参数。特点是没有函数体,直接定义在类名后面即可,如下方代码所示,实例化student对象的时候,必须传入构造函数当中要求的所有参数
kotlin
class student(val sno:String,val grade:Int):Person(){}
这个时候想要在主构造函数中编写一些逻辑,的init结构体中进行编写。在这Person后的括号可以理解为调用父类的构造函数
kotlin
class student(val sno:String,val grade:Int):Person(){
init{
println("sno is" + sno)
}
}
注意:当父子类都显示了声明了主构造函数,子类的构造函数中要传入父类的字段,但是不能加val或者var,子Kotlin中,在主构造函数声明val或者var的参数将自动变成该类的字段,这就会导致和父类同名的字段造成冲突。
- 次构造函数
通过constructor关键字来定义
kotlin
class student(val sno:String,val grade:Int):Person(){
constructor(name:String,age:Int):this("",0,name,age){
}
constructor():this("",0){
}
}
3.2 java和Kotlin函数可见性修饰符对照表
private和public的范围一致,其他三个有区别
4.数据类与单例类
4.1数据类
在Kotlin中实现Model相对于Java简单很多,在包->new->kotlin file/class ,在弹出的对话框中选择"Data" (基于Android14)
下面这行代码就能表示Model类
kotlin
data class hello(var brand:String)
4.2单例类
5 Lambda编程
5.1 listof()函数
用于向List集合中添加数据,下方代码创建了List类型的集合
kotlin
var list = listOf("Apple","Banana","Orange");
注意:listOf()函数创建的是一个不可变的集合,该集合只能用于读取,我们无法对集合进行添加,修改和删除操作。
- 可变集合的创建
kotlin
val list = mutableListOf("Apple","Banana","Orange","Pear","Grape")
5.2 SetOf()
5.3Map集合
kotlin
fun hello(){
val map = HashMap<String,Int>()
map["apple"] = 1;
map["banana"] = 2;
val m = mapOf("apple" to 1,"banana" to 2);
}
5.4 集合的函数式API
- Lambda的定义:一小段可以作为参数传递的代码
- 语法结构
- {参数名1:参数类型,参数名2:参数类型->函数体}
5.4 可空类型系统
- Int?表示可空的整形,String?表示可空的字符串。Int表示不可为空的整形
- 判空辅助工具 ?:,这个操作符的左右两边都接收一个表达式,如果左边表达式的结果不为空就返回左边的表达式的结果,否则就返回右边表达式的结果。