前言

众所周知Kotlin已经成为Android开发必不可少的开发语言!


注:在Kotlin基础教程中,将会以IDEA作为编译器。

本篇内容仅仅是语法的初探,不会刻意深入。先掌握最基础的,然后再循序渐进学习Kotlin。

1. HelloWord

学习一门语言,满满的仪式感还是要有的。

fun main() {

    var hello="Hello word";

    println (hello)

    println( hello.javaClass.name)

    hello="Hello my word"

    println("this is my first kotlin project: $hello")

    val age: Int = 10;
    
	//age=12 会直接提示语法错误!
	
	val size =12
	
    println("age-------> $age")
}

我们先看运行效果,再来分析这段代码

Connected to the target VM, address: '127.0.0.1:61364', transport: 'socket'
Hello word
java.lang.String
this is my first kotlin project: Hello my word
age-------> 10
Disconnected from the target VM, address: '127.0.0.1:61364', transport: 'socket'

这里我们看到:

  • 在Kotlin中定义变量有两种方式,分别为valvar
  • 在Kotlin中,定义变量可采用 var/val 变量名:变量类型=属性值 格式来定义变量;
  • 也可采用 var/val 变量名=属性值,通过对应属性值的类型来确认变量类型;
  • 通过var定义的变量可以修改对应变量的属性值;
  • 而通过val定义的变量则不能修改对应变量的属性值(与java的final类似);
  • 代码语句后面可以不用写分号;
  • 在拼接字符串使用变量的时候,需要使用特殊符号$+变量名

这里说到对应变量可以在拼接字符串的时候使用,那么能不能在拼接字符串的时候使用简单逻辑呢?

2. 条件语句判断

2.1 if…else…

fun main() {
    val orgin = "Jack"
    val dest = "Rose"
    println("$orgin love $dest")
    val flag = false
    /**
     * ${} 语法 可以在 字符串里面做简单逻辑处理
     */
    println("Answer is:${if (flag) "我可以" else "你是好人"}")
}

从这里看出在拼接字符串的时候使用了${}语法,里面就是一个很简单条件语句判断。运行看看效果:

Connected to the target VM, address: '127.0.0.1:65152', transport: 'socket'
Jack love Rose
Answer is:你是好人
Disconnected from the target VM, address: '127.0.0.1:65152', transport: 'socket'

从这运行效果上看:当使用了${}语法,那么对应大括号里面就可以使用简单的条件语句判断。

这里使用了if…else…语法,那么Java里面的switch…case语法呢?在Kotlin里面是怎样的?

2.2 when(xxx){…}

使用示例一:

fun main{
    val school="小学"
    val level:Any=when(school){
        "学前班"->"幼儿"
        "小学"->"少儿"
        "中学"->"青少年"
        "大学"->"成年"
        else ->{
            print("未知")
        }
    }
    println(level)
}

先看看运行效果:

Connected to the target VM, address: '127.0.0.1:49681', transport: 'socket'
少儿
Disconnected from the target VM, address: '127.0.0.1:49681', transport: 'socket'

这里的when可以理解成java的switch;而对应的"学前班",可以理解成对应的case "学前班""幼儿"可以理解成对应case后的逻辑代码;else可以理解为对应的default

使用示例二:

fun main{
    var age=12
    age++
    when (age) {
        in 0..8 -> {
            println("少儿,年龄为:$age")
        }
        in 8..18 -> {
            println("青少年,年龄为:$age")
        }
        else -> {
            println("成年,年龄为:$age")
        }
    }
}

代码都挺简单的,这次换成了表达式,是否在某个区间内。直接看运行效果:

Connected to the target VM, address: '127.0.0.1:50707', transport: 'socket'
青少年,年龄为:13
Disconnected from the target VM, address: '127.0.0.1:50707', transport: 'socket'

通过这俩个小demo可以看出:在when闭包里,可以使用简单的表达式来进入不同的业务逻辑。

到这为止,已经讲解了变量定义以及最基础的条件语句判断,那么接下来就该轮到方法了。

3. 方法的定义与使用

3.1 示例一:

fun main{
    var helloStr: String = hello("Tom")
    println(helloStr)
    /**
     * 调用方法时,如果方法有多个参数,则可以无序指定 传值
     */
    helloStr = hello(age = 18, name = "bob")
    println(helloStr)
    add(12, 13.5F)
}

private fun hello(name: String, age: Int = 12): String {
    return "Hi,My Name is $name ,My Age is $age"
}

private fun add(a: Int, b: Float) {
    println("a+b= ${a + b} ")

}

还是依旧先看运行效果:

Connected to the target VM, address: '127.0.0.1:53401', transport: 'socket'
Hi,My Name is Tom ,My Age is 12
Hi,My Name is bob ,My Age is 18
a+b= 25.5 
Disconnected from the target VM, address: '127.0.0.1:53401', transport: 'socket'

从这段代码可知:

  • 最基础定义方法的语法:fun+方法名+(各种形参):方法返回值{}
  • 在定义方法的时候,可以给对应的形参赋初始值操作,当有初始值时,使用时可以不用传对应的形参参数;
  • 在使用对应方法的时候,默认按照形参定义顺序依次赋值,当然也能指定赋值。

3.2 示例二:

var letter = "Mississippi"
fun main{
    var total = "Mississippi".count()
    println(total)
    val totals = letter.count { letter -> letter == 's' }
    println(totals)
}

运行效果

Connected to the target VM, address: '127.0.0.1:54286', transport: 'socket'
11
4
Disconnected from the target VM, address: '127.0.0.1:54286', transport: 'socket'

从这运行效果可以看出:

  • .count()名副其实的计数
  • .count {}意思就是只会计数闭包内容为true的次数

敲黑板了!!接下来重点了!!

3.3 示例三:

fun main{
    val bb: (age: Int, name: String, sex: Int) -> String = { age: Int, name: String, sex: Int ->
        val holiday = "New Year."
        var str = "Happy $holiday"
        "$str your age= $age ;your name= $name ;your sex= ${if (sex==2) "男" else "女"}" 
    }
    println(bb(12, "张三", 2))
}

按照上面的知识点,对于不懂Kotlin的你阔能会思考:val不是用来定义变量用的么?咋下面怎么变成了方法的调用?what are you 弄啥呢?这写法是什么意思?

上面我们说到:定义变量的时候 ,可以指定var/val:后面对应的变量类型。那么我们按照这个语法将后面的这代码

(age: Int, name: String, sex: Int) -> String = { age: Int, name: String, sex: Int ->
        val holiday = "New Year."

        var str = "Happy $holiday"

        "$str your age= $age ;your name= $name ;your sex= ${if (sex==2) "男" else "女"}"
}

当做是变量bb的变量类型,接着我们又看这个(age: Int, name: String, sex: Int) -> String感觉像是方法的定义,只不过这里不是(各种形参):方法返回值,而是(各种形参)->方法返回值

如果说它真的是方法的定义,那么它的方法名是什么?等等!!!难道是刚刚定义的bb?而后面的方法就是变量bb的变量类型?后面大括号里的内容就是方法的实现?哦!!!

茅塞顿开的你,运行了代码:

Connected to the target VM, address: '127.0.0.1:57927', transport: 'socket'
Happy New Year. your age= 12 ;your name= 张三 ;your sex= 男
Disconnected from the target VM, address: '127.0.0.1:57927', transport: 'socket'

看了看运行效果,果然,还真是按自己想象的结果来的。

3.4 示例四:

fun main{
    val getDiscountWords: (goodsName: String, hour: Int) -> String = { goodsName: String, hour: Int ->
        val currentYear = 2027
        "$currentYear 年 ,双11 ${goodsName} 促销倒计时:${hour} 小时"
    }
    showOnBoard("餐厅纸", getDiscountWords);
}

fun showOnBoard(goodsName: String, showDisCount: (String, Int) -> String) {
	//1-24之间取随机数
    val hour: Int = (1..24).shuffled().last()
    println(showDisCount(goodsName, hour))
}

这次你又看到了刚刚那种写法,能够一眼就能确定getDiscountWords就是一个方法,并且返回值为String,对应闭包里面的内容就是这个方法的实现。

现在来到showOnBoard这个方法里面。我们看到第一个形参类型为String;第二个就形参发现居然是这种类型变量名:(各种形参)->方法返回值,那么我们就该想到,第二个参数形参类型为方法,所以println(showDisCount(goodsName, hour))这段代码,将会调用上面传入的getDiscountWords方法。

现在带着这样的分析,看看这个运行效果:

Connected to the target VM, address: '127.0.0.1:59158', transport: 'socket'
2027 年 ,双11 餐厅纸 促销倒计时:10 小时
Disconnected from the target VM, address: '127.0.0.1:59158', transport: 'socket'

哈哈哈,完美运行。

结束语

到了到这里,相信你对Kotlin有了一个初步的认知。在下一篇中,将会更进一步讲解Kotlin的语法知识!