Kotlin急速入门-第一期
变量与非变量
- val
- 一次写入不可变动
- 不会变的变量请使用他,这样满足函数式编程
- var
- 可变动
数据类型
和其他语言差不多,大概有下面这些,够用就行
- Int
- Float
- Double
- String
- Array
- ArrayInt
- ArrayString
- …
占位符
kotlin不会使用传统的%s
占位符,转而如同shell一样使用字符串中$
来识别
例如
print("hello world $name")
当我们需要在print中处理这些变量(比如查看字符串长度啥的)
这个时候就用大括号包起来
print("My name length is ${name.length}")
kotklin支持自由格式字符串
val desp: String = """
我尝试使用三引号的方式
这样他可以自由输入我的格式
""".trimMargin()
在默认情况下。他可能会出现异常情况
hello world xieMy name length is 3
我尝试使用三引号的方式
这样他可以自由输入我的格式
可以发现。我的自由格式字符串中前面的缩进符号被意外的引入了进来,此时就需要我们用trimMargin
函数去处理掉
val desp: String = """
我尝试使用三引号的方式
这样他可以自由输入我的格式
""".trimMargin()
这样输出就正常了
hello world xieMy name length is 3 我尝试使用三引号的方式
这样他可以自由输入我的格式
进程已结束,退出代码为 0
当然,你想输出$
还是可以使用\$
来实现的
函数
基础函数
函数和GO有点不一样
命名方式从func
改为了fun
变量申明方式从之前的(a int)
改为了a:Int
返回值不在使用(int)
,转而使用:Int
(无括号)
同事搞出来了等式函数(不使用{}
直接在一行使用=
// 创建一个无返回值函数
fun funcName(a :Int,b :Int){
//函数正文
}
// 上面funcName是函数名 a是第一个变量,他需要输入int型,由于没有返回值,因此不写返回值部分
// 有返回值的函数
fun addNum(a :Double,b :Double):Double{
return a+b
}
// 上述情况下,返回了一个Double类型
// 需要注意,默认直接输入的数字1 2 3 是int类型,除非主动超出130
// 因此,下面这样去调用addNum函数是会报错的,因为函数要求输入的是Double类型,但是发过去的是Int
var ab = addInt(1,2)
// 在kotlin中,想要变成Double最简单就是加个小数点,加了就可以正常识别了。需要注意,Float类型存在,但是需要给数字后面加个f,也就是1.0f
var ab = addInt(1.0,2.0)
// Kotlin支持函数表达式,用来处理简单的函数,如下图所示
fun addNum(a:Int,b:Int):Int=a+b
函数缺省值传入
Kotlin支持缺省值传入,具体实现如下
fun mulitInt(a:Double=10.0,b:Double=20.0):Double{
return a*b
}
// 其中a:Double=10.0就设置了该变量默认为10.0(Double)
// 我这里啥都不输入
println("${mulitInt()}")
// 这里返回就是200.0
// 也可以给它赋值,赋值后自动覆盖
println("${mulitInt(100.0,200.0)}")
// 这里返回就是20000.0
// 这里默认输入值得信息是100.0为a,200.0位b,我们可以手动指定值来实现乱序输入
println("${mulitInt(b=100.0,a=200.0)}")
闭包与内部函数
闭包一般用于内部函数
中使用
内部函数就是指的我在一个函数中包含一个函数(不是子函数,函数式类用的)
闭包则是指的,将这个内部函数的值作为输入返回到外部函数
巨抽象,我也不是很理解
但是利用闭包和内部函数可以实现一些神奇的操作
// 很多时候,我们需要用闭包和内部函数,用于处理一个大的功能
// 比如这就是一个很抽象的例子。输入的a是Int,但是b是Double,我就需要用外部函数将a转为Double,并使用内部函数addNum将值进行相加并返回,之后在外部函数进行调用实现返回值。
fun Closure(a: Int, b: Double): Double {
// 首先将a处理为Double
var aDouble = a.toDouble()
// 这里就是一个内部函数
fun addNum(a: Double): Double {
// 内部函数可以取到外部函数的变量信息。换个话说,你可以直接引用外部函数的一切
return a + b
}
// 我们在一个函数中调用它的内部函数,此时就是一个闭包操作
return addNum(aDouble)
}
fun main(){
println("${Closure(11, 1145713.0)}")
}
Vararg(可变长输入)
很多场景下,我们是没法去判断输入值的数量的,比如计算器啥的。这种情况下,就可以用到vararg属性
go也有。只不过是用...int
来实现,而Kotlin则使用了vararg
属性来申明
使用该属性的的时候需要注意,请务必将vararg属性放到最后,避免混淆
// 申明方式很简单
fun printAllInput(vararg lists: Int) {
for (i in lists.indices) {
print(lists[i])
}
}
// 需要注意,千万别写下面这种代码,这种代码有歧义,且严格模式下没法编译
fun xxx(vararg lists:Int,name:String){
}
infix(中缀输入法)
这玩意基本用不上,而且挺有歧义的。还得预先申明,先看下面这三条原则
- infix所在的函数只能接受一个值
- infix标记的函数,必须要是
成员函数
(一个class下的func)或者是拓展函数
- 该函数不能接受vararg(可变长变量)且不能有默认值
实现出来的效果如下
val u = Util(5)
print(u sum 5 )
// 返回10
可以发现。我们没有输入.
或者括号。他也能正常执行,这就是infix的作用。
创建一个infix的方法如下
class cal (var num:Double){
infix fun add (a:Double){
return a+num
}
}
这样我们就创建了一个cal类,在该类中实现了一个函数add,并且将该函数标记为infix
之后,我们调用它的时候,只需要执行
fun main(){
// 创建一个该类的对象
var hackCal = cal(15)
// 执行内部的infix 函数
// 下面这句话不会产生结果,只是进行了计算
hackCal add 10 // 不产生结果,但是其实已经完成计算,结果为25,这里可以看到我没用任何符号
println("\n${hackCal add 20.0}") //会打印结果35
}