学习参考文档:http://www.kotlinlang.org/docs/reference/basic-syntax.html
包名在文件的最顶部
package my.demo
import java.util.*
它不需要匹配目录和包:源文件可以放在任意的文件系统。
See Packages.
一个源文件可以以声明一个包开始:
package foo.bar
fun baz() {}
class Goo {}
// ...
以上源文件的内容(包括类和函数)都包含在包的声明里。所以,以上示例, baz()的全名是foo.bar.baz,Goo类的全名是foo.bar.Goo。
如果没有声明包,源文件的内容属于一个没有名字的“default”包里。
.
Imports
除了默认的import,每个文件可以包含它自己的import指令
我们可以导入一个包名,就包括了导入该包下的所有内容,包括(类,函数等)
import foo.Bar //
也可以这么导入
import foo.* //
import foo.Bar // Bar is accessible
import bar.Bar as bBar // bBar stands for 'bar.Bar'
Visibility of Top-level Declarations
如果一个顶级声明是私有的,则它声明的文件是私有的!
有返回值的函数
看下面示例一,该函数sum有两个Int参数,函数的返回值类型是Int!
fun sum(a: Int, b: Int): Int {
return a + b
}
下面是函数用一个表达式表示,并将表达式作为一个返回值类型
fun sum(a: Int, b: Int) = a + b
无返回值的函数
下面的函数是一个没有返回值的函数,或者说函数返回一个没有实际意义的值(Function returning no meaningful value:),用Unit 和Java中的void功能相似
fun printSum(a: Int, b: Int): Unit {
print(a + b)
}
关键字Unit可以忽略不写
public fun printSum(a: Int, b: Int) {
print(a + b)
}
See Functions.
仅分配一次本地变量
val a: Int = 1
val b = 1 // Int类型被引用
val c: Int // 引用的类型没有进行初始化
c = 1 // 分配
可变变量
var x = 5 // `Int` type is inferred
x += 1
See also Properties And Fields.
fun main(args: Array<String>) {
if (args.size() == 0) return
print("First argument: ${args[0]}")
}
See String templates.
fun max(a: Int, b: Int): Int {
if (a > b)
return a
else
return b
}
也可以用一个表达式
fun max(a: Int, b: Int) = if (a > b) a else b
See if-expressions.
一个引用值必须详细的标出当值为Null时是否可以为null。
一下示例,如果该函数没有整数返回,则返回Null。
fun parseInt(str: String): Int? {
// ...
}
用一个返回值可以为空的函数
fun main(args: Array<String>) {
if (args.size() < 2) {
print("Two integers expected")
return
}
val x = parseInt(args[0])
val y = parseInt(args[1])
// Using `x * y` yields error because they may hold nulls. x和y如果为Null可能出错
if (x != null && y != null) {
// x and y are automatically cast to non-nullable after null check检查完是否Null之后,x和y会自动映射成一个非空值
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
}
// x and y are automatically cast to non-nullable after null check
print(x * y)
See Null-safety.
如果表达式是一个类型的实例,就是类型检查。如果一个不可变的局部变量或属性是特定类型,则无需进行类型转换:
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// `obj` is automatically cast to `String` in this branch
return obj.length
}
// `obj` is still of type `Any` outside of the type-checked branch
return null
}
备注:该函数可以返回null或者整数,这个比Java灵活,返回类型写成这个样子了Int?
or
fun getStringLength(obj: Any): Int? {
if (obj !is String)
return null
// `obj` is automatically cast to `String` in this branch
return obj.length
}
or even
fun getStringLength(obj: Any): Int? {
// `obj` is automatically cast to `String` on the right-hand side of `&&`
if (obj is String && obj.length > 0)
return obj.length
return null
}
See Classes and Type casts.
fun main(args: Array<String>) {
for (arg in args)
print(arg)
}
备注:for循环使用 关键字in
进行的
或者可以这么写
for (i in args.indices)
print(args[i])
See for loop.
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")
}
}
备注:该条件表达式比较灵活,可以比较整数,字符串的值,也可以判断类型,还有默认的else
以下操作是检查数字是否在一个数值范围内:
if (x in 1..y-1)
print("OK")
检查一个数字是否在数值范围外:
if (x !in 0..array.lastIndex)
print("Out")
遍历一个数值范围:
for (x in 1..5)
print(x)
See Ranges.
遍历一个集合:
for (name in names)
println(name)
下面操作是检查一个集合是否含有某个对象:
if (text in names) // names.contains(text) is called
print("Yes")
用函数来过滤并遍历Map集合:
names.filter { it.startsWith("A") }.sortBy { it }.map { it.toUpperCase() }.forEach { print(it)
}
See Higher-order functions and Lambdas.