Android Developer

Kotlin的那些细节-基础函数和变量

1、Kotlin的特性和语法

fun max(args: Array<String>) {
    println("Hello,World")
}

由以上Kotlin代码可以看出

  • 关键字 fun 用来声明一个函数

  • 参数的类型写在它的名称后面,变量的声明也是如此

  • 函数可以定义在文件的最外层,不需要放在类中

  • 数组就是类和Java不同,kotlin没有声明数组类型的特殊语法

  • Kotlin 标准库给Java标准库函数提供了许多语法更简洁的包装

  • 可以省略每行代码结尾的分号

2、语句和表达式

表达式和语句的区别:

  • 表达式有值,并且能作为另一个表达式的一部分使用

  • 语句总是围绕着它的代码块中的顶层元素,并且没有自己的值

  • Java中:所有的控制结构都是语句

  • Kotlin中:除了循环(for、do、do/while)以外的大多数控制语句都是表达式

  • Java中的赋值操作是表达式而Kotlin中是语句,这有助于避免比较和赋值之间的混淆,而这种混淆是常见的错误来源

3、表达式函数体

fun max(a: Int,b: Int): Int = if(a > b) a else b

//如果函数体写在花括号中,我们说这个函数有代码块体
//如果直接返回了一个表达式,他就有表达式体

在IDEA中就支持这种转换:

 Convert to expression body转换成表达式函数体
 Convert to block body转换成代码块函数体
 //intention actions: Convert to expression body、Convert to block body

返回值类型:

fun max(a: Int,b: Int) = if(a > b) a else b

省掉返回值类型,使用了类型推导

只有表达式体函数的返回类型可以省略,对于代码块体函数,必须显式的写出返回类型和return语句

4、变量

4.1、变量的类型声明

val answer = 42       //声明一个Int 类型,可以省略它的类型

val question :String = "who am i"   //声明一个 String类型,也可以指定它的类型

val answer :Int     //   变量没有初始化器,需要显式的指定它的类型
answer = 42

val yearsTime = 7.5e6    // 使用浮点数常量,没有声明类型的时候,那么变量默认就是Double类型

4.2、可变变量和不可变变量

声明变量的关键字有两个:val 和var

  • val(来自value)—不可变引用。声明的变量不能在初始化之后再次赋值,它对应的是Java的final变量

  • var(来自variable)—可变引用。声明的变量可以被改变,这种声明对应的是Java普通的(非final)变量

默认情况下,应该尽可能的使用val关键字声明所有的kotlin变量,仅在必要的时候转成var。使用不可变引用和可变引用及无副作用的函数让你的代码更接近函数式编程风格。

val message: String    //在定义了val变量的代码块执行期间,val变量只能进行唯一一次初始化
if(canRead())){
    message = "Success"
} else{
    message = "Failed"
}
//如果编译器能够确保只有唯一一条初始化语句被执行,可以根据条件使用不同的值初始化

//尽管val引用自身不可变,但是它指向的对象是可变的
val languages = arrayListOf("java")
languages.add("kotlin")               //改变引用指向的对象

var关键字允许变量改变自己的值但是他的类型确实改变不了的如果需要在变量中存储不匹配的类型必须手动转换或者强制转换到正确的类型
var size = 42
size = "this is size"  //error

5、字符串模板

方式一

fun main(args:Array<String>){
    val name = if (args.size > 0) args[0] else "kotlin"
    println("Hello,$name!")            //等价于Java中字符串的拼接,编译后代码创建了StringBuilder对象,把常量和变量附加上去
    println("Hello,\$Kotlin!")         //如果在字符串中使用$ 需要转义
}

方式二

fun main(args:Array<String>){
     if (args.size > 0) {
          println("Hello,${args[0]}!")      //  可以引用复杂的表达式,需要用花括号
     }
}

方式三

fun main(args:Array<String>){
    val name = if (args.size > 0) args[0] else "kotlin"
    println("Hello,${if (args.size > 0) args[0] else "kotlin"}!")     //可以使用双引号嵌套双引号,只要他们在某个表达式内(即花括号内)
}

TODO 只为补充kotlin编码当中的小细节