Kotlin学习笔记(一)

学习参考文档: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。
一下示例,如果该函数没有整数返回,则返回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.

你可能感兴趣的:(基础,文档,Kotlin)