Kotlin - 开始 - 1 基础语法

定义包

在源文件的顶部指定包:

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

目录和包不需要匹配,源文件可以放在文件系统中的任何地方。

定义函数

接受两个Int参数并返回Int类型的函数:

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

用表达式作为函数体,返回类型可推断:

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

返回无意义的值:

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

Unit类型的返回值可以省略:

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

定义局部变量

一次赋值(只读)局部变量:

val a: Int = 1 // 立即赋值
val b = 2 // Int 类型可推断
val c: Int // 没有提供初始值则需要指定类型
c = 3 // 延迟赋值

可变变量:

var x = 5 // Int 类型可推断
x += 1

注释

如同Java和Javascript,Kotlin支持行内注释和块注释:

// 这是行内注释
/* 这是一个注释块
  包含多行 */

与Java不同,Kotlin中块注释可以嵌套。

使用字符串模板

var a = 1
// 在模板中使用简单名称:
val s1 = "a is $a"
a = 2
// 在模板中使用任意表达式:
val s2 = "${s1.replace("is", "was")}, but now is $a"

使用条件表达式

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

if当作表达式使用:

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

使用可空(Nullable)进行null检查

一个引用必须显式标明可空,才能接受null值。
如果str中不包含数字,就返回null值:

fun parseInt(str: String): Int? {
  // ...
}

使用返回可空值的函数:

fun printProduct(arg1: String, arg2: String) {
  val x = parseInt(arg1)
  val y = parseInt(arg2)
  // 使用 x * y 可能引发错误,因为它们可能为null
  if (x != null && y != null) {
  // 在null检查之后,x、y 自动转换为非空
    println(x * y)
  } else {
    println("either '$arg1' or '$arg2' is not a number")
  }
}

// ...
if (x == null) {
  println("Wrong number format in arg1: '${arg1}'")
  return
}
if (y == null) {
  println("Wrong number format in arg2: '${arg2}'")
  return
} 
// 在null检查之后,x、y 自动转换为非空
println(x * y)

使用类型检查和自动转换

运算符is用来检查一个表达式是否是某个类型的实例。如果一个只读局部变量或属性被检查为某个特定类型,则无需再对其进行显式转换:

fun getStringLength(obj: Any): Int? {
  if (obj is String) {
  // 在此分支中 obj 自动转换为 String 类型
    return obj.length
  }  
  // 在包含类型检查的分支之外,obj 仍是 Any 类型
  return null
}

fun getStringLength(obj: Any): Int? {
  if (obj !is String) return null
  // 在此分支中 obj 自动转换为 String 类型
  return obj.length
}

甚至这样

fun getStringLength(obj: Any): Int? {
  // 在运算符 && 的右边,obj 自动转换为 String 类型
  if (obj is String && obj.length > 0) {
    return obj.length
  } 
  return null
}

使用for循环

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

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

使用while循环

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

使用when表达式

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

使用范围(Range)

使用in运算符检查数字是否在某个范围内:

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

检查数字是否不在某个范围内:

val list = listOf("a", "b", "c")
if (-1 !in 0..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")
}

在范围上迭代:

for (x in 1..5) {
  print(x)
}

还可以指定步长:

for (x in 1..10 step 2) {
  print(x)
}
for (x in 9 downTo 0 step 3) {
  print(x)
}

使用集合

在集合上迭代:

for (item in items) {
  println(item)
}

使用in检查集合是否包含某个对象:

when {
  "orange" in items -> println("juicy")
  "apple" in items -> println("apple is fine too")
}

使用lambda表达式过滤map集合:

fruits
  .filter { it.startsWith("a") }
  .sortedBy { it }
  .map { it.toUpperCase() }
  .forEach { println(it) }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值