Kotlin学习篇(1)—— Kotlin的基础常识

目录

    • 1. Kotlin的优缺点
    • 2. 在java项目添加Kotlin支持
    • 3. if的使用
    • 4. 变量
    • 5. 字符串模板
    • 6. when
    • 7. is的使用
    • 8. 迭代
    • 9. “in”和“!in”的使用

1. Kotlin的优缺点

Kotlin的优势:

  1. Kotlin更安全: Kotlin 支持显式地声明 null,并确保开发人员不会遇到可能导致质量问题的空引用异常;

  2. 代码简洁:不需要分号、很多相同的功能去用Kotlin实现语法更简洁

  3. 函数式支持: 高阶函数

  4. 扩展函数:可以直接不需要修改某个类的源码而给这个类添加新的功能

  5. 内联函数:使用 Lambda 表达式时,这些内联函数让它比 Java 编写的代码运行得更快;

  6. 支持线程的并发协同:Kotlin中当取消一个线程执行的时候,并不会阻塞任何其他线程,Java 虽然也允许多线程在后台运行,但它的处理机制更加复杂,在处理长时间运行的网络 I/O 或 CPU 密集型任务方面,Kotlin 比 Java 更具有领先优势;

Kotlin的缺陷:

目前,它还不支持很多功能,比如静态成员、通配符类型、非私有字段、Checked Exception、原始类型以及三元运算符等等。

2. 在java项目添加Kotlin支持

java项目添加kotlin支持

3. if的使用

fun max(a: Int, b: Int): Int {
     
    return if (a > b) a else b
}

在Kotlin中,if是有结果值的表达式,它和java中的三元运算符?类似。在Kotlin中,除了循环(for,do 和 do/while)以外的大多数控制结构都是表达式。另一方面,java的赋值操作是表达式,在Kotlin中是语句。

4. 变量

  1. 可以省略变量的类型,编译器会分析初始化器表达式的值,并把它的类型作为变量的类型

  2. 也可以显示的指定类型

  3. 如果变量没有初始化器,需要显示的指定它的类型

    val b = "hello Kotlin"
    val c : String = "hello Kotlin"
    val answer : Int
    

可变变量和不可变变量

val(来自value)——不可变引用 不能在初始化之后再次赋值,对应于java中的final变量
var(来自variable)——可变引用 变量的值可以被改变。

注意

  • 应该尽可能的使用val关键字来声明所以的Kotlin变量。尽在必要时换为var

  • val指向的对象可能是可变的。

    //这是被允许的 
    val languages = arrayListOf("java")
     languages.add("Kotlin")
    

5. 字符串模板

Kotlin让你可以在字符串字面值中引用局部变量,只需在变量名前加上字符$

//相当于java中的字符串拼接(“hello”+name+"!")
val name = "liming"
println("hello , $name!")

还可以引用更复杂的表达式

fun max(a: Int, b: Int): Int {
     
    return if (a > b) a else b
}
println("the max of two number is ${
       max(1,2)}")

6. when

when是一个有返回值的表达式,如下写一个直接返回when表达式的表达式体函数,

对应于java中的switch语句,但你不用在每个分支上都写break语句,如果匹配成功,只有对应的分支会执行。

fun getMnemonic(color : Color) =
        when (color) {
     
            Color.BLUE -> "red"
            Color.INDIGO -> "indigo"
            Color.GREEN,Color.ORANGE,Color.RED ->"green"		//也可以把多个值合并到一个分支
            else -> "else"							//相当于switch的default		
        }

注:Kotlin的when结构比java中的switch强大的多。when允许使用任何对象作为分支条件。

fun mix(c1 : Color, c2 : Color) = 
        when( setOf(c1,c2) ) {
     
            //setOf是一个函数,可以创建一个Set,它会包含所有指定的函数实参的对象
            setOf(Color.RED,Color.ORANGE) -> Color.ORANGE
            setOf(Color.INDIGO,Color.GREEN) -> Color.YELLOW
            else -> throw  Exception("Dirty color")
        }

此外还可以使用不带参数的when

fun mixOptimized(c1 : Color, c2:Color) =
        when{
     
            c1 == Color.YELLOW && c2 == Color.GREEN -> 1
            else -> 2
        }

7. is的使用

is用来检查判断一个变量是否是某种类型,和java中的instanceOf类似,并且在用is检查过一个变量是否是某种类型后,后面就不再需要转换它的类型,可以就把它当作你检查过的类型使用。(事实上是编译器为你执行了类型转换)

8. 迭代

在Kotlin中迭代的实现也是靠while和for,其中while的用法和java中基本相同,for循环不同。

区间: 本质上就是两个值之间的间隔。表示如下:

//定义区间
val oneToTen = 1..10

注意:

  • 这个区间包含开始值和结束值。
  • 不仅可以创建数字区间,还可以创建字符区间。,或者支持实例比较操作的类,如String类型

使用:

  1. 猜字游戏(when和for循环结合使用)

    fun main(args : Array<String>){
           
        for(i in 1..100){
           
            println(fizzBuzz(i))
        }
    }
    fun fizzBuzz(i : Int) = when{
           
        i % 15 == 0 -> "FizzBuzz"
        i % 3 == 0 -> "Fizz"
        i % 5 == 0 -> "Buzz"
        else -> "$i"
    }
    
  2. 进阶使用:从100开始倒着计数并且只计偶数

    for( i in 100 downTo 1 step 2){
           		//100 downTo 1是递减数列,步长为-1.step把步长的绝对值设为2
            println(fizzBuzz(i))		
        }
    

    注意:step必须是正的

  3. 迭代不包含结束值的半区间写法

    for( x in 0 until 100){
            println(fizzBuzz(x))
        }
    
  4. 迭代map

    val binaryReps = TreeMap<Char,String>()     //定义map集合
        for(c in 'A'..'Z'){
           
            val binary = Integer.toBinaryString(c.toInt())
            binaryReps[c] = binary                  //向map集合添加元素
        }
        
        for( (letter,binary) in binaryReps){
                   //map的迭代
            println("$letter = $binary")        
        }
    

    注意:

    • 可以使用map[key]读取值,并使用map[key] = value设置它们,而不需要调用get和set方法。
    • binaryReps[c] = binary等价于它的java版本binaryReps.put(c,binary)
    • 可以使用 (letter,binary) in binaryReps 这样的扩展语法在迭代集合的同时跟踪当前项的下标

9. “in”和“!in”的使用

使用 in 运算符来检查一个值是否在区间内,使用 !in 来检查这个值是否不在区间内。

fun isLetter(c : Char) = c in 'a'..'z' || c in 'A'..'Z'  
fun isNotDigit(c : Char) = c !in '0'..'9'

注:

  • c in ‘a’…‘z’ 在底层被换成 ‘a’ <= c && c <= ‘z’
  • in 检查也适用于集合。

你可能感兴趣的:(Kotlin学习笔记,kotlin)