Kotlin急速入门

Kotlin快速入门并上手安卓

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
}
时间流逝中|构建版本:40|构建时间:2024-04-23 09:51|Jenkins自动构建正常运行中
Built with Hugo
主题 StackJimmy 设计