Kotlin 初步介绍-语法

Kotlin 也是把代码编译成 .class 文件,Java 也是这样,所以 Android 前几年支持Kotlin,今天就初步介绍一些基本的语法。

定义常量与变量
var <标识符> : <类型> = <初始化值>   // var 是关键字,意思是可变的
val <标识符> : <类型> = <初始化值>   // val 是关键字,意思是不可变的,相当于Java中声明对象时,使用了 final

举个例子,上面是 kotlin 写法,下面是 Java 写法

var a: Int = 1
var b: String = "hello"
val a1: Int = 2
val b1: String = "world"

int aa = 1;
String bb = "hello";
final int aa1 = 2;
final String bb1 = "world";

以上就是对比,发现点什么没?kotlin中不需要以分号结尾,java中则是必须的。kotlin中声明对象,类型是可以省略的,比如可以 var a = 1,这种属于类型推导。Kotlin 中数字的加减和Java中的一些操作符用法是相同的,比如说 +,+=,-,-=,*,/,%等等;它里面打印的方法是 println();对于字符串,我们可以打印一个 hello world,

fun main(args: Array<String>) {
    val s = "hello world"
    println(s)
}

这里的 main 方法,就相当于是 Java 中的 main 方法,上面只是直观的打印了 s 的值,如果我们相拥字符串把 s 包裹一下,同时带你 s 的值呢,或者说给 s 拼接上一个字符串 "I am back" 怎么办?Java 中直接用 + 把两个字符串拼接起来就行,Kotlin 中也可以用 + 来实现,还可以通过在字符串中使用 $ 来实现

fun main(args: Array<String>) {
    var s = "hello world"
    var ss = " I am back "
    s+=ss
    println(s)
}

fun main(args: Array<String>) {
    var s = "hello world"
    var ss = " I am back "
    println("$s$ss")
}

字符串中 $ 相当于引用对象,注意 println("$s$ss") 方法中的写法,两个对象是用字符包裹的,并且是紧挨在一起的,如果中间有空隙,则拼接的s和ss中间也有间隙。$ 的用法更多是在我们的一串文字中,要引用某个字符串对象,这时候就比较方便了,

fun main(args: Array<String>) {
    var s = "hello world"
    var ss = "I am back"
    val s1 = "I like $s and $ss"
    println(s1)
}

如果想在s1中的字符ss后面拼接一个 _2 怎么办,直接在 $ss 后面写会报错,这时候使用{}来解决,{}代表一个整体

fun main(args: Array<String>) {
    var s = "hello world"
    var ss = "I am back"

    val s1 = "I like $s and ${ss}_2"
    println(s1)
}


对于方法,比如说求两个数据的和,先用java语言写一个

    private int sum(int a, int b) {
        return a + b;
    }

下面使用 kotlin 写一个

    fun sum(a: Int, b: Int): Int {
        return a + b
    }

kotlin 的方法中,它的参数类型是写在形参的后面,并且中间用冒号隔开,同时在方法的后面有个冒号和 Int ,它代表的是返回的类型,方法前面使用 fun 来修饰,其实上面的写法可以简化,把返回的类型和return等省去,

    fun sum(a: Int, b: Int) = a + b

上面默认的就是 private 修饰方法,如果此方法是 public 修饰的,则冒号和 Int 标识类型的代码,不能省略

    public fun sum(a: Int, b: Int): Int = a + b

我们java方法中,有个可变参数的概念,那么用kotlin怎么实现呢

    fun printVars(vararg ar: Int) {
        for (i in ar) {
            print(i)
        }
    }

    private void  printVars(int... ar) {
        for (int i : ar){
            System.out.println(i);
        }
    }

如果我们调用 printVars(1, 2, 3, 4, 5),则打印出 12345,这里 vararg 就相当于是java中的 ... 这个符号,for循环中使用 in 来标识,那么打印1到9怎么表示?

    fun printNum() {
        for (i in 1..9) {
            print(i)
        }
    }

for 循环中使用了 in 这个关键字, 1到9 用的是 .. 来表示,如果想打印从a到b之间的数,则

    fun printFor(a: Int, b: Int) {
        for (i in a..b) {
            println(i)
        }
    }

忽然想起刚学java时打印的乘法口诀了,此时用 kotlin 来写,则

    fun multipForm(){
        for(i in 1..9){
            for (j in 1..9){
                if(j < i + 1){
                    print(" $i * $j = ${i*j}\t")
                }
            }
            println()
        }
    }


\t 表示一个标准的空格符,打印出来的效果为

 1 * 1 = 1    
 2 * 1 = 2     2 * 2 = 4    
 3 * 1 = 3     3 * 2 = 6     3 * 3 = 9    
 4 * 1 = 4     4 * 2 = 8     4 * 3 = 12     4 * 4 = 16    
 5 * 1 = 5     5 * 2 = 10     5 * 3 = 15     5 * 4 = 20     5 * 5 = 25    
 6 * 1 = 6     6 * 2 = 12     6 * 3 = 18     6 * 4 = 24     6 * 5 = 30     6 * 6 = 36    
 7 * 1 = 7     7 * 2 = 14     7 * 3 = 21     7 * 4 = 28     7 * 5 = 35     7 * 6 = 42     7 * 7 = 49    
 8 * 1 = 8     8 * 2 = 16     8 * 3 = 24     8 * 4 = 32     8 * 5 = 40     8 * 6 = 48     8 * 7 = 56     8 * 8 = 64    
 9 * 1 = 9     9 * 2 = 18     9 * 3 = 27     9 * 4 = 36     9 * 5 = 45     9 * 6 = 54     9 * 7 = 63     9 * 8 = 72     9 * 9 = 81    
 


kotlin 的一大优势就是减少了大量的对象非空判断,比如定义一个对象 address,如果直接使用 = ,则表示不能为null;如果想让初始化的值为null,则在初始化赋值时,使用 ?= 来表示,意思允许为null;比如说我们打印一个字符串的长度

    fun printLength() {
        var address = "China"
        var length = address.length
        println(length)
    }

如果我们使用了 ?= 来初始化值,获取 length 时编译器会提示错误,使用 !!. 来表示,它的意思是你确定此时 address 不为null再使用,出问题了你自己负责

    fun printLength() {
        var address: String? = "China"
        var length = address!!.length
        println(length)
    }

也就是说,我肯定这里 address 不为null,可以使用 !!. 来调用长度的方法;如果我们不能保证 address 不为null怎么办?用 ?. 来修饰,它表示一旦为null,不会抛异常,会返回一个 null ,

    fun printLength() {
        var address: String? = null
        var length = address?.length
        println(length)
    }

接下来重点来了,比如说上面的 length ,如果 address 不为null,则取它的长度;如果为null,则取一个默认值2,怎么办?这时候 ?: 闪亮登场

    fun printLength() {
        var address: String? = null
        var length = address?.length ?: 2
        println(length)
    }

上面的代码是个缩影,获取嵌套对象属性时为了避免大量的非空判断,可以把 ?. 和 ?: 配合使用来完成要做的功能,常用的一个地方就是持久化保存属性值的时候 CacheUtils.putBoolean(context, key, value); 使用来保存boolean 值对象的,此时 value 需要从一个封装好的对象中获取,加入说 A 对象中有个属性 B 对象,B 对象中有个boolean属性 isOn,取值时,不论是 A 还是 B 为null时value默认值使用 false,怎么获取value呢? value = A?.B?.isOn?:false 即可,省去了java中一堆的判断。


 

发布了176 篇原创文章 · 获赞 11 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/Deaht_Huimie/article/details/103264226
今日推荐