Kotlin入门语法

1.Kotli中的变量

/*
在Kotlin中,变量只分为val和var.

而val变量只能被赋值一次,相当于在初始化进行赋值后,后续就不能改动该变量。
而var变量是能够重复赋值。
例:
val a = 1
var a1 = 2

在Kotlin中,常用的变量类型有:
Int (整数类型)
String (字符串类型)
Boolean (布尔值类型)
Double (浮点数类型)
*/

2.Kotlin中的函数

函数声明:
fun + 函数名(参数类型):返回值
例子:
fun xiaosu(su:String):Int
这个例子是说有一个su函数接受String类型的参数,而在返回值返回Int类型数值

fun xiaosu()="xiaosu"
也可以这样写成不带任何参数,而返回"xiaosu"

或者可以写成
fun xiaosu(su:String) = su
这样相当于
fun xiaosu(su:String):String
{
	return su
}

3.Kotlin中的条件语句

Kotlin中的条件语句分为If和When 语句
例子:
if(a1>b1){
	所要执行的逻辑
}
else{
	所要执行的逻辑
}

if条件语句还能跟赋值语句结合,例如:
val a1 = if(a1>b1){
	num1
}
else{
	num2
}
这里逻辑很简单,如果a1>b1 则返回num1 给a1,否则返回num2

如果这样也可以跟函数结合,例如:
fun su(a1:Int,b1:Int) = if(a1>b1) a1 else b1
这里相当于传进两个整形参数,进行比较,那个大就返回那个

Kotlin中的When语句相当于匹配:
when(num1){
	"xiaosu" -> println("num1 is xiaosu")
	"xiaosu3" -> println("num1 is xiaosu3")
	else -> println("num1 is null")
}
也可以进行类型匹配
fun checkNumber(num:Number){
	when(num){
		is Int -> println("num is Int")
		else -> println("num is not support")
	}
}

when控制语句也能跟函数和赋值语句进行
fun xiaosu(num1:String) = when(num1){
	"xiaosu" -> 77
	else -> 0
}
	

4.Kotlin的循环语句

Kotlin中的循环语句就理解为For语句行,例子:
for(i in 0..10)
或者可以这样写
for(i in 0 until 10 step 2) 这个循环语句说明i 在010的范围中循环,并且按照每次自增2进行

val a1 = 0 until 10 
for(i in a1) 也能这样写

如果For语句无法满足一些场景,也可以使用While语句,但是实在太少用了,不做介绍了。

5.Kotlin中的面向对象编程

创建一个类:
class xiaosu(){
	var a1 = ""
	var a2 = 0
	fun xiaosu1()
}
实例化一个类:
	val su = xiaosu()
	su.a1 = "xiaosu"
	su.a2 = 1
	su.xiaosu1()
创建继承类:
open class xiaosu()

继承类的用法:
class xiaosu2:xiaosu()
这里后面被继承的类中带有括号是需要注意的,因为这个跟类的主次构造函数有关
首先类中都会自带一个无参构造函数,无论你是否声明在创建类的时候会自动分配一个
而主构造函数是没有函数体的,所以一般只要给类传进参数就会实现。
class xiaosu2(val su1:String,val su2:String):xiaosu()

而如果想要在主构造函数中实现逻辑实现,就需要借助Init函数了
class xiaosu2(val su1:String,val su2:String):xiaosu(){
	init{
		println("xiaosu is cool boy")
	}
	//这里提醒一下Init函数体中不适合写长逻辑语句,所以建议实现短逻辑
}

这里举一个继承类所会出现的问题
open class xiaosu(val name1:String,val name2:String)
class xiaosu2(val name:String,val age:String):Person()

如果这样子去写,会出现语法错误,因为你所继承的类带有参数类型,你在声明该类,需要构造父类,而父类带有参数类型,他的无参构造已经不适用
所以必须要给父类传参数,所以这里需要这样改。

class xiaosu2(val name:String,val age:String,name1:String,name2:String):Person(name1,name2)
这里提醒一下不能将name和age赋值给Person类,因为他已经被声明了val,说明他就属于xiaosu2这个类了。

讲完主构造函数,现在讲一下次构造函数。
任何一个类只能有一个主构造函数,但是可以有多个次构造函数
次构造函数需要借助constructor这个函数名来实现
例如:

class xiaosu2(val name:String,val age:String,name1:String,name2:String):Person(name1,name2)
{
	constructor(name:String,age:String):this("","","","")
	{
	
	}
	constructor():this("xiaosu","xiaosu")	
	{}
	这里解释一下为何这样写,因为Kotlin是可以同时允许主构造函数和次构造函数存在,但是次构造函数必须要初始化主构造函数
	第一个次构造函数初始化了主构造函数,但是第二个却是无参,但是他初始化了第一个次构造函数,所以他这是合法。
}

以及还有一种特殊情况,就是没有显示定义主构造函数,只有次构造函数时:
class xiaosu1:xiaosu{
	constructor(name:String,age:Int):super(name,age)
}
这里代表着如果xiaosu1没有主构造函数,那么也不用去调用父类的主构造函数了,通过次构造函数+super去调用即可。


6.Kotlin的Lambda编程

这里Lambda编程主要针对Map Set 和List这几类,我这里也简单介绍一下。
List一般处理的是ArrayList和LinkedList,大部分的时候都是使用ArrayList
Set一般处理的是HashSet
Map一般处理的是HashMap

List的声明:
val l1 = ArrayList<String>()
l1.add("xiaosu")


也可以这样写
val l1 = listOf("xiaosu")
这种写法,只能初始化添加一次,后续不能通过add来使用,但是可以通过mutableListOf来声明

val l1 = mutableListOf("xiaosu")
l1.add("xiaosu")

遍历List的方法通过for循环
for(i in l1) println(i)


Set的声明
val a1 = setOf("1")
也可以写成
val a1 = mutableSetOf("xiaosu")
他的规律跟List差不多一样,所以不多介绍


Map的声明
val a1 = HashMap<String:Int>()
a1.put("小苏",1)

也可以这样添加元素
a1["xiaosu"] = 1

他也拥有mapOf和mutableMapOf这两种声明方法,也不做太多介绍了

那么现在开始介绍Lambda编程的神奇之处,这里给出一个例子
val l1 = listOf("xiaosu","xiaosu2","xiaosu3")
val Lambda = {fruit:String->fruit.length}
val numberMaxList = l1.maxBy(Lambda)
这上述语句是寻找l1中的列表中的长度最大的元素

这里一步一步解析:
1.首先先声明一个listOf类型的列表赋值给li
2.声明一个Lambda语法,Lambda语法的结构为  {变量名:变量类型->函数体},这里我们声明了一个fruit的String变量,函数体则寻找String变量的长度
3.将这个Lambda给List中的maxBy这个函数中,这个函数是List自带的,我们将这个Lambda逻辑赋值给maxBy(),那么他将会寻找长度最长的字符,按照这个逻辑。

然后还可以继续对Lambda语句进行简化。
val numberMaxList = l1.maxBy({fruit:String -> fruit.length})
这里根据Kotlin的一个特性,当一个函数Lambda参数是最后一个参数时,可以将该参数放置括号外
val numberMaxList = l1.maxBy(){fruit:String -> fruit.length}
这里根据Kotlin另一个特性,当函数中Lambda参数是唯一一个参数时,可以将函数括号去掉
val numberMaxList = l1.maxBy{fruit:String->fruit.length}
这里根据Kotlin的另一个特性,当函数中的Lambda结构体中只可以不声明该参数类型
val numberMaxList = l1.maxBy{fruit->fruit.length}
这里根据Kotlin的另一个特性,当函数中的Lambda结构体中只有一个参数,那么我们可以用it代替他
val numberMaxList = l1.maxBy{it.length}

7.Kotlin针对空指针的处理

Kotlin是不会出现空指针异常等情况
因为在运行时,Kotlin的编译器会进行一次空指针检查,如果没有声明一个指针,那么将会报错

而这时候如果你想要对指针进行其他处理,可以通过以下符号给编译器提醒
a1?.confuse()这个语句是代表,如果a1不为空就调用confuse()这个函数

如果我想要给函数传一个null,但是编译器会错误认为这个为空指针该如何处理,可以这样解决
fun xiaosu(study:Study?){
}
//这样就可以声明study可为null

如果当你声明一个函数,在逻辑上已经声明了他,但是编译器依然认为他为空,这时候需要通过强判定字符 !!这个去声明
这两个字符代表非空断言字符。

fun print(){
	val up = content!!.toUpperCase()
}

8.Kotlin的字符内嵌

在Kotlin中有一种技术叫做字符内嵌,它可以解决输出累赘问题,例如:
val a1 = "xiaosu"
val a2 ="xiaosu2"
println("a1="+a1 +","+"a2="+a2)
这样写感觉很累赘,那么可以通过字符内嵌去解决
println("a1=$a1,a2=$a2")这样输出效果与第一句一模一样
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值