欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

详解Kotlin中的变量和方法

程序员文章站 2023-12-04 14:29:52
详解kotlin中的变量和方法 变量 kotlin 有两个关键字定义变量:var 和 val, 变量的类型在后面。 var 定义的是可变变量,变量可以被重复赋值。...

详解kotlin中的变量和方法

变量

kotlin 有两个关键字定义变量:var 和 val, 变量的类型在后面。

var 定义的是可变变量,变量可以被重复赋值。val 定义的是只读变量,相当于java的final变量。

变量的类型,如果可以根据赋值推测,可以省略。

var name: string = "jason"
name = "jame"

val max = 10

常量

java 定义常量用关键字 static final, kotlin 没有static, 可以在命名对象里面用 const val 定义

object config {
  const val tag = "config"
}

或者伴随对象

class config {
  companion object {
  const val tag = "config"
}
}

方法

方法通过 fun 定义, 包含若干参数和返回值(可选)

fun log(msg: string): unit {
  println(msg)
}

方法没有返回值用 unit, 一般省略不写。

单表达式方法

如果方法只有一个表达式,可以采用“=”的简明写法

fun square(x: int) = x * x

顶层方法

java 的方法都在 class 里面, kotlin 支持顶层方法,这些方法定义在 class 的外面。

顶层方法一般是一些工具方法,和 java 将这些方法勉强放到一个不关联的类不同, 单独提供这些方法似乎更合理。

fun main(args: arraylist<string>) {
  //
}

class hello() {
  //
}

参数

java 不支持默认参数, 只能通过重载定义多个方法,kotlin支持, 带默认值的参数放后面。

fun divide(divisor: bigdecimal, scale: int = 0): bigdecimal

class student2(val name: string, val registered: boolean = false, credits: int = 0)

当调用方法时,kotlin支持命名参数,这有助于提高代码的可读性,尤其是多参数的方法。带名字的参数放后面。

fun deletefiles(filepattern: string, recursive: boolean, ignorecase: boolean, 
    deletedirectories: boolean): unit
{
  // do something
}

deletefiles("*.jpg", true, true, false)

deletefiles("*.jpg", recursive = true, ignorecase = true, deletedirectories = false)

不定长度参数

例如 java public void println(string.. args) { } 可以这样定义不定个数参数的函数。

kotlin 通过关键字 vararg 实现这个功能,如示例:

fun prints(vararg strings: string) {
  for (string in strings)
  println(string)
}

prints("a", "b", "c")

如果已经有一个数组, 可以通过关键字*传递数组。

val strings = arrayof("a", "b", "c", "d", "e")
prints(*strings)

返回多个值

要返回多个值,可以返回数组,或者自定义类型。kotlin内置了 pair 和 triple, 返回2个值和3个值。

fun roots(k: int): pair<double, double> {
  require(k >= 0)
  val root = math.sqrt(k.todouble())
  return pair(root, -root)
}

val (pos, neg) = roots(16)

尾递归函数(tail recursive function)

当一个函数标记为tailrec , 并且满足要求的形式, 编译器就会对代码进行优化, 消除函数的递归调用, 产生一段基于循环实现的, 快速而且高效的代码。

tailrec fun findfixpoint(x: double = 1.0): double = if (x == math.cos(x)) x 
    else findfixpoint(math.cos(x))

上面的代码计算余弦函数的不动点(fixpoint), 结果应该是一个数学上的常数。这个函数只是简单地从 1.0 开始不断重复地调用 math.cos 函数, 直到计算结果不再变化为止, 计算结果将是 0.7390851332151607。

要符合 tailrec 修饰符的要求, 函数必须在它执行的所有操作的最后一步, 递归调用它自身。不能将尾递归用在 try/catch/finally 结构内。 尾递归目前只能用在 jvm 环境内。

函数引用

和 c 语言的函数指针类似, 函数可以赋值给变量, 也可以作为高阶函数的参数或者返回值,例如:

val printmessage = { message: string -> println(message) }

printmessage("hello")
printmessage("world")

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!