@cxm-2016
2016-11-21T02:30:58.000000Z
字数 2612
阅读 2762
Kotlin
版本:2
翻译:李颖
转载自:Kotlin Reference
包的定义应该在源代码文件的最上方:
package my.demoimport 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 {print(a + b)}
返回值为 Unit 类型时, 可以省略:
fun printSum(a: Int, b: Int) {print(a + b)}
只读的局部变量:
val a: Int = 1val b = 1 // 变量类型自动推断为 `Int` 类型val c: Int // 没有初始化语句时, 必须明确指定类型c = 1 // 明确赋值
可读写的变量:
var x = 5 // 变量类型自动推断为 `Int` 类型x += 1
与 Java 和 JavaScript 一样, Kotlin 支持行末注释, 也支持块注释.
// 这是一条行末注释/* 这是一条块注释可以包含多行内容. */
与 Java 不同, Kotlin 中的块注释允许嵌套.
fun main(args: Array<String>) {if (args.size == 0) returnprint("First argument: ${args[0]}")}
fun max(a: Int, b: Int): Int {if (a > b)return aelsereturn b}
以表达式的形式使用 if:
fun max(a: Int, b: Int) = if (a > b) a else b
当一个引用可能为 null 值时, 对应的类型声明必须明确地标记为可为 null.
当 str 中的字符串内容不是一个整数时, 返回 null:
fun parseInt(str: String): Int? {// ...}
以下示例演示如何使用一个返回值可为 null 的函数:
fun main(args: Array<String>) {if (args.size < 2) {print("Two integers expected")return}val x = parseInt(args[0])val y = parseInt(args[1])// 直接使用 `x * y` 会导致错误, 因为它们可能为 null.if (x != null && y != null) {// 在进行过 null 值检查之后, x 和 y 的类型会被自动转换为非 null 变量print(x * y)}}
或者
// ...if (x == null) {print("Wrong number format in '${args[0]}'")return}if (y == null) {print("Wrong number format in '${args[1]}'")return}// 在进行过 null 值检查之后, x 和 y 的类型会被自动转换为非 null 变量print(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.lengthreturn null}
fun main(args: Array<String>) {for (arg in args)print(arg)}
或者
for (i in args.indices)print(args[i])
fun main(args: Array<String>) {var i = 0while (i < args.size)print(args[i++])}
fun cases(obj: Any) {when (obj) {1 -> print("One")"Hello" -> print("Greeting")is Long -> print("Long")!is String -> print("Not a string")else -> print("Unknown")}}
使用 in 运算符检查一个数值是否在某个范围之内:
if (x in 1..y-1)print("OK")
检查一个数值是否在某个范围之外:
if (x !in 0..array.lastIndex)print("Out")
在一个值范围内进行遍历迭代:
for (x in 1..5)print(x)
在一个集合上进行遍历迭代:
for (name in names)println(name)
使用 in 运算符检查一个集合是否包含某个对象:
if (text in names) // 将会调用 names.contains(text) 方法print("Yes")
使用 Lambda 表达式, 对集合元素进行过滤和变换:
names.filter { it.startsWith("A") }.sortedBy { it }.map { it.toUpperCase() }.forEach { print(it) }
