详解Kotlin中的变量和方法

 更新时间:2017年06月30日 10:09:24   作者:jinkui  
这篇文章主要介绍了详解Kotlin中的变量和方法的相关资料,需要的朋友可以参考下

详解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")

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

相关文章

  • Springboot整合log4j2日志全解总结

    Springboot整合log4j2日志全解总结

    这篇文章主要介绍了Springboot整合log4j2日志全解总结,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-12-12
  • SpringBoot ScheduledTaskRegistrar解决动态定时任务思路详解

    SpringBoot ScheduledTaskRegistrar解决动态定时任务思路详解

    本文将从问题出发,详细介绍ScheduledTaskRegistrar类是如何解决动态调整定时任务的思路,并给出关键的代码示例,帮助大家快速地上手学习
    2023-02-02
  • Mybatis通用Mapper(tk.mybatis)的使用

    Mybatis通用Mapper(tk.mybatis)的使用

    本文主要介绍了Mybatis通用Mapper(tk.mybatis)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • Springboot整合junit过程解析

    Springboot整合junit过程解析

    这篇文章主要介绍了Springboot整合junit过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • 一文读懂ava中的Volatile关键字使用

    一文读懂ava中的Volatile关键字使用

    volatile关键字的作用保证了变量的可见性(visibility)。被volatile关键字修饰的变量,如果值发生了变更,其他线程立马可见,避免出现脏读的现象。这篇文章主要介绍了ava中的Volatile关键字使用,需要的朋友可以参考下
    2020-03-03
  • 通过Java查看程序资源占用情况

    通过Java查看程序资源占用情况

    这篇文章主要介绍了通过Java查看程序资源占用情况,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Java String.format()的用法

    Java String.format()的用法

    本篇文章主要介绍了JAVA的 String.format()的使用,具有一定的参考价值,有需要的可以了解一下,希望能够给你带来帮助
    2021-11-11
  • Java中的Spring 如何处理循环依赖

    Java中的Spring 如何处理循环依赖

    这篇文章主要介绍了Java中的Spring 如何处理循环依赖,依赖指的是Bean与Bean之间的依赖关系,循环依赖指的是两个或者多个Bean相互依赖,关于更多Spring 处理循环依赖的详情,需要的朋友可以参考下面文章具体内容
    2022-05-05
  • SpringBoot+SpringSecurity处理Ajax登录请求问题(推荐)

    SpringBoot+SpringSecurity处理Ajax登录请求问题(推荐)

    这篇文章主要介绍了SpringBoot+SpringSecurity处理Ajax登录请求问题,本文给大家介绍的非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2017-12-12
  • Java详细分析梳理垃圾回收机制

    Java详细分析梳理垃圾回收机制

    垃圾回收,顾名思义,便是将已经分配出去的,但却不再使用的内存回收回来,以便能够再次分配。在 Java 虚拟机的语境下,垃圾指的是死亡的对象所占据的堆空间
    2022-04-04

最新评论