Kotlin

一、介绍

Kotlin 是一个用于现代多平台应用的静态编程语言,由 JetBrains 开发。

Kotlin可以编译成Java字节码,也可以编译成JavaScript,方便在没有JVM的设备上运行。

Kotlin 已正式成为Android官方支持开发语言。

2016年2月15日 Kotolin v1.0(官方稳定版) 发布。

2017谷歌I/O大会上,谷歌宣布,将Kotlin语言作为安卓开发的一级编程语言。

Android Studio 3.0 内置支持Kotlin

二、基础

1.基本类型

在 Kotlin 中, 所有东西都是对象,就是说任何变量都可以调用成员函数和属性。

  • 数字
TypeBith width
Double64
Float32
Long64
Int32
Short16
Byte8

Float 使用 f 或者 F 标记 :123.5f

  • 字符用 Char 类型标示。它们不能直接当做数字
  • 布尔用 Boolean 类型表示。
  • 字符串用 String 类型表示。

Kotlin 有两种类型的字符串字面值:转义字符串可以有转义字符,原生字符串可以包含换行和任意文本。

转义字符串和 Java 字符串类似:

     val s = "Hello, world!\n"

原生字符串使用 """ 三个引号分界符括起来,内部没有转义并且可以包含换行和任何其他字符。

    val text = """
     for (c in "foo")
        print(c)
    """
  • Array 数组
    var nums= arrayOf(1,2,3)

2. 类型

2.1 变量

Kotlin 的变量分为 var (可变的) 和 val (不可变的)

变量声明:

var num1: Int = 1 
var num2 = 2  //自动推断
var num3: Int
num3 = 3

2.2. 可空值及Null 检测

当某个变量可以为 null 的时候,必须在声明处的类型后添加 ? 来标示

可空之后会进行装箱操作,也就是说如果是一个数值类型的话那么可空之后则是一个引用类型

 var num: Int?

null 检测之后,如果检测通过那么对应变量会自动转换为非空值

var num: Int?   
if(num!=null){    prinltln(num)  }    //

2.3 类型检测及自动类型转换

is 运算符检测一个表达式是否某类型的一个实例。

检测通过后的分支可以直接当做该类型使用,而不需要再显示转换。

if (obj is String) {
    var length = obj.length
}

3. 流程控制

(1) If

在Kotlin中 If 是一个表达式,它会返回一个值。可以代替三元运算符来使用。

   val max = if (a > b) a else b

If 分支可以是代码块,最后的表达式作为该块的值:

    val max = if (a > b) {
        print("Choose a")
        a
    } else {
        print("Choose b")
        b
    }

(2) When

when 取代了 类 C 语言的 switch 操作符。

when 既可以当做表达式使用也可以当做语句使用。

    var result = when (obj) {
        1 -> "One"
        2, 3 -> "One or Two"
        "Hello" -> "Greeting"
        is Long -> "Long"
        !is String -> "Not a string"
        else -> "Unknown"
    }

4.编码规范

1.类规范

通常一个类的内容按照以下顺序排列:

  • 属性声明与初始化块
  • 此构造函数
  • 方法声明
  • 伴生对象

2.命名规范

Kotlin 遵循Java 命名规范

类和对象的名称以大写字母开头并使用驼峰。

函数、属性和局部变量的名称以小写字母开头、使用驼峰且不适用下划线。

常量名称使用大写、下划线分隔。

三、Kotlin集合

1.介绍

Kotlin 分为可变集合和不可变集合,这样有助于消除bug和设计良好的API.

主要有三种类型: list、set、map

2.集合遍历

  • 遍历 map/pair 型 list

     for ((k, v) in map) {
         println("$k -> $v")
     }
  • 遍历 list , 包含索引和值 (.withIndex())

    var items = listOf("a", "b", "c")
    for ((index, value) in items.withIndex()) {
        println("$index : $value")
    }
  • 遍历 list

    val items = listOf("apple", "banana", "kiwi")
    //Type1
    for (item in items) {
        println(item)
    }
    //Type2
    for (index in items.indices) {
        println("item at $index is ${items[index]}")
    }

4.lambda 对集合的操作

val fruits = listOf("banana", "avocado", "apple", "kiwi")

fruits.filter { it.startsWith("a") }
      .sortedBy { it }
      .map { it.toUpperCase() }
      .forEach { println(it) }

四、其他

1. Range 区间

使用 in 关键子来检测某个数字是否在制定区间内

for (i in 1..100) { …… } // 闭区间: 包含 100 , 等同于 i>=1 && i<=100
for (i in 1 until 100) { …… } // 半开区间: 不包含 100
for (x in 2..10 step 2) { …… }
for (x in 10 downTo 1) { …… }
if (x in 1..10) { …… }

2.需要注意的知识点:

  1. == ===

== : 比较的是值

===: 比较的是地址

在Kotlin中操作符== 会被编译器翻译成调用 equals() 函数

  1. 通过 ? 标示为可空后为引用类型

3.简单技巧:

1.字符串模板 ($+变量名称)

    var str = "abc"
    val s1 = "String : $str"
    val s2 = "String : ${str.toUpperCase()}"   // 模板中的任意表达式
  1. ?: (如果左侧为null 则返回右侧)
    var str: String="str"
    var str2 =str?:"Test"
  1. ?. (左侧不为null则执行返回右侧属性)
  2. !! (左侧不为null则执行右侧方法)
Last modification:January 14th, 2020 at 07:17 pm