ll。
另一种选择是用工厂函数获得数组尺寸,并且返回指定索引位置的数组元素的初始值:
1 // Creates an Array<String> with values ["0", "1", "4", "9", "16"]
2 val asc = Array(5, { i -> (i * i).toString() })
如上所述,[]操作符表示调用成员函数get()和set()。
注意:与Java开发语言不同,在Kotlin开发语言中,数组是不变量。这意味着kotlin开发语言不允许赋值Array<String>到Array<Any>,这防止运行的可能的错误(但是,可以用Array<out Any>,查看:类型推测(3.7.2))。
Kotlin开发语言也有专用类表示原始类型的数组,不需要装箱消耗:ByteArray、ShortArray、IntArray等等。这些类与Array类没有继承关系,但是它们有相同的一组方法和属性。它们中的每一个都有相应的工厂函数:
1 val x: IntArray = intArrayOf(1, 2, 3)
2 x[0] = x[1] + x[2]
2.1.5. 串
String类型表示串。String是不可变的。串的元素是字符,可以用索引操作访问:s[i]。可以用for循环遍历一个串:
1 for (c in str) {
2 println(c)
3 }
2.1.5.1. 串文字
Kotlin开发语言有两种串文字类型:包含转义字符的转义串和包含任意字符和新行符的原始串。转义串非常像Java开发语言的串:
1 val s = "Hello, world!\n"
转义可以用习惯的方法(用\)实现。
原始串由三引号(”””)定界的,包含非转义字符、新行符,以及其它任意字符:
1 val text = """
2 for (c in "foo")
3 print(c)
4 """
2.1.5.2. 串模板
串可以包含模板表达式,即:可计算的代码片段,其结果链接到串中。模板表达式以美元符号($)开始,和简单的名字构成:
1 val i = 10
2 val s = "i = $i" // 计算结果是 "i = 10"
或是在大括号中的任意表达式:
1 val s = "abc"
2 val str = "$s.length is ${s.length}" // 计算结果是 "abc.length is 3"
在原始串和转义串中,都支持模板。如果需要表达$字符文字,则可以用下列语法:
1 val price = "${'$'}9.99"
2.2. 包
一个源文件可以是从声明包开始的:
1 package foo.bar
2
3 fun baz() {}
4 class Goo {}
5 // ...
源文件中的所有内容(如:类和函数)都包含在包的声明中。所以,在上面例子中,baz()的完整名称是foo.bar.baz,Goo的完整名称是foo.bar.Goo。
如果源文件中没有指明包,则这个文件中的内容属于没有名称的“默认”包。
2.2.1. 导入(import)
除默认的import外,每个文件都可以有自己的import伪指令。Import的句法在语法(6.2)中描述了。
我们既可以导入单个名称,如:
1 import foo.Bar // Bar is now accessible without qualification
也可以是范围内所有可访问的内容(包、类、对象等等):
1 import foo.* // everything in 'foo' becomes accessible
如果有命名冲突,可以在冲突项用as关键字重命名来消除:
1 import foo.Bar // Bar可以访问
2 import bar.Bar as bBar // bBar 表示 'bar.Bar'
import关键字不限制导入的类;也可以用途导入其它声明:
—— 顶层函数和属性;
—— 在对象声明(3.12.2)中声明的函数和属性;
—— 枚举常数(3.11);
不像Java开发语言,Kotlin开发语言没有独立的“import static”句法;所有这些声明都是用常规的import关键字来导入。
2.2.2. 顶层声明的可视范围
如果顶层声明标注private,它是它所在文件的私有的(查看:可视性修饰符(3.4))
2.3. 控制流
2.3.1. if表达式
在Kotlin开发语言中,if是一个表达式,即:它返回一个值。由于在此规则下普通if运行的很好,因此没有三元运算符(?:else)。
1 // 传统用法
2 var max = a
3 if (a < b)
4 max = b
5
6 // 带else
7 var max: Int
8 if (a > b)
9 max = a
10 else
11 max = b
12
13 // 作为表达式
14 val max = if (a > b) a else b
if分支可以是代码块,最后表达式是代码块的值:
1 val max = if (a > b) {
2 print("Choose a")
3 a
4 }
5 else {
6 print("Choose b")
7 b
8 }
如果用if作为表达式,而不是语句(例如,返回它的值,或赋值给变量),表达式要求有else分支。
查看:if语法(6.2.3.4)
2.3.2. when表达式
When替代了类似C开发语言的switch操作符。最简单形式如此:
1 when (x) {
2 1 -> print("x == 1")
3 2 -> print("x == 2")
4 else -> { // Note the block
5 print("x is neither 1 nor 2")
6 }
7 }
when将变量与其的所有分支顺序逐一匹配,直至找到条件相符的分支。when即可用作表达式,也可以用作语句,满足条件的分支值就是整个表达式的值。如果它用作语句,个别分支的值将被忽略。(就如同if,每个分支可以是一个代码块,代码块中最后的表达式值就是其值。)
else分支等价与没有其它分支满足条件。如果when用作一个表达式,且编译器无法验证分支条件覆盖了所有的可能情况,则强制性要求else分支。
如果多种情况都有相同的处理方法,也可以用逗号将分支条件组合起来:
1 when (x) {
2 0, 1 -> print("x == 0 or x == 1")
3 else -> print("otherwise")
4 }
可以用任意表达式(不仅仅是常数)作为