天天看点

Kotlin学习之起始篇—基础语法

Kotlin学习之起始篇—基础语法

Kotlin被Android接纳为官方语言已经一年多了,现在才开始学习,实在惭愧。希望能一点点进步,到最后能完全用Kotlin开发app。废话就不多说了。Let’s get started!

1. 定义包

package my.demo
import java.util.*
// ...
           

包名要放在源文件的开头位置,好像和Java没什么区别,除了末尾不用分号

结束。这是

Kotlin

Java

的一大不同点,语句结束不用加分号

2. 定义函数

2.1 有参,有返回值函数

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

传入两个Int类型参数,返回Int数值。函数名前面要添加关键字

fun

。参数类型及返回值类型的定义方式和Java大不相同。

像这样的函数体只有一句表达式,返回值类型可自动推断的函数,可以简写如下:

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

2.2 有参,无返回值函数

fun printSum(a: Int, b: Int): Unit {
    println("sum of $a and $b is ${a + b}")
}
           

其中的关键字

Unit

类似于Java里面的

void

关键字。可以理解为返回一个无意义的值或者说无返回值。无返回值的函数还可以简写如下:

fun printSum(a: Int, b: Int) {
    println("sum of $a and $b is ${a + b}")
}
           

3. 定义变量

3.1 声明变量

var a: Int = 
var b = 
           

声明一个变量时必须使用

var

关键字,然后定义类型,也可以不定义,不定义的话系统会自动推断它的类型,这是和Java变量声明最不同的地方,Java的变量必须声明类型。

3.2 只读变量(常量)

用关键字

val

来定义一个只读变量,变量一旦初始化之后,不可再次赋值。类似于Java中使用

final

关键字定义一个常量。

4. 代码注释

和Java是一样的

// 单行注释

/*  代码块
    多行注释 */
           

5. 使用字符串模板

var a = 
// 简单模板:
val s1 = "a is $a" 

a = 
// 复杂一点的:
val s2 = "${s1.replace("is", "was")}, but now is $a"
           

使用一个美元符号

$

+ 变量名,就能引用该变量的值,别忘了外面要加双引号。甚至在引用的时候还能对值进行操作,需要注意,这种操作并不会改变原变量(上面代码里的

s1

)的值。

6. 使用条件表达式

if语句:

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

一个获取最大值的方法,看起来和Java的写法一样啊,哈哈哈。其实它还能简写:

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

一行代码就写好了,这就是传说中的

语法糖

吧。用熟练了,写起来确实轻松。

7. 使用可空值,进行null检查

var a: String = "323"
  var b: String? = "dfd"
           

使用问号

?

,表明该变量b为可空,而变量a一定不能为空,如果在使用过程中给变量a赋

null

值,将会自动报错,所以可以放心地操作a,比如

a.length

一定不会出现

NullPointException

。 而如果调用

b.length

则将会报错,因为变量b有可能为空。如果一定要调用可以使用安全调用符

?.

代替

.

, 比如

b?.length

,那么当b为

null

时,这个方法将返回

null

,而不是出现

NullPointException

关于安全调用符

?.

, 比如我们有一个对象

Person

,里面有一个对象参数

school

,对象School里有字符串变量

schoolName

, 现在我们要知道这个人所在学校的名称。那么使用通常方式是:

Person.school.schoolName

,但是如果对象

person

null

或者

school

null

,这种调用将会出现

NullPointException

,如果使用安全调用符:

Person?.school?.schoolName

,只要其中某个对象为空,结果将返回

null

,而不是直接报错。

fun printProduct(arg1: String, arg2: String) {
    //将字符转换为数字,如果转换失败将返回null
    val x = arg1.toIntOrNull()
    val y = arg2.toIntOrNull()
    if (x != null && y != null) {
        //计算x和y的乘积
        println(x * y)
    } else {
        //打印信息,提示某个参数无法转换
        println("either '$arg1' or '$arg2' is not a number")
    }
}
           

上面这种null检查和Java里的写法差不多,进行操作之前先检查是否为null

获取一个字符串的长度,如果为空,返回-1

val l: Int = if (b != null) b.length() else -
           

另一种简略写法:有点像Java里面的三目运算,如果不为空,返回b的长度,否则返回-1

8. 类型检查和自动转换

fun getStringLength(obj: Any): Int?{
      return if(obj is String) obj.length else null
  }
           

使用

is

操作符判断参数的类型,类似于Java 里面的

instanceof

操作符,判断之后,可以直接调用其对应类的方法,相当于做了类型转换。上面的

Any

类型类似于Java的

Object

类型,是所有类的父类。

9. 使用for循环

val items = listOf("apple", "banana", "kiwifruit")
for (item in items) {
    println(item)
}
           

Java里面使用冒号

:

作循环操作符, 而Kotlin使用

in

。另一种Kotlin写法如下:

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

通过

list

index

来循环

10. 使用while循环

val items = listOf("apple", "banana", "kiwifruit")
var index = 
while (index < items.size) {
    println("item at $index is ${items[index]}")
    index++
}
           

和Java一样。。

11. 使用when表达式

fun describe(obj: Any): String =
    when (obj) {
         -> "One"
        "Hello" -> "Greeting"
        is Long -> "Long"
        !is String -> "Not a string"
        else -> "Unknown"
}
           

类似于Java中的

Switch

表达式,但

when

功能更强大,它能够使用表达式作为分支条件。可以使用

when

来替代

if - else if

表达式

12. 使用ranges

val x = 
val y = 
if (x in .y+) {
    println("fits in range")
}
           

使用关键字

in

检查数值是否在某个范围内。

val list = listOf("a", "b", "c")
if (- !in .list.lastIndex) {
    println("-1 is out of range")
}
if (list.size !in list.indices) {
    println("list size is out of valid list indices range too")
}
           

检查数值是否在某个范围外。

range迭代, 打印 1 到 5

for (x in ) {
    print(x)
}
           

13. 使用Collections

集合的遍历上面已经介绍过,这里就不说了。

使用lambda表达式对集合进行过滤和映射等操作

fun printSpecificFruit(){
     var fruits = listOf("apple", "orange", "pearl", "pineapple")
     fruits.filter { it.contains("ap") }
             .sortedBy { it }
             .map { it.toUpperCase() }
             .forEach { println(it) }
 }
           

其中的关键字

it

用来指代集合中的单项。使用

filter

方法过滤内容,

sortedBy

方法对集合排序,

map

方法进行映射,最后打印出来的内容如下:

APPLE

PINEAPPLE

14. 创建类的实例

var rectangle = Rectangle(, ) 
var triangle = Triangle(, , )
           

和Java相比,连关键字

new

都不用了。

第一次接触Kotlin,难免理解有误,请不吝指教。