kotlin学习二:函数
时间:2020-05-28
本文章向大家介绍kotlin学习二:函数,主要包括kotlin学习二:函数使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
kotlin学习二:函数
函数书写:
声明:fun
fun double(x: Int): Int {
return 2 * x
}
入口函数:main
fun main() {
println("Hello world!")
}
参数 name: type
函数参数使用 Pascal 表示法定义,即 name: type。参数用逗号隔开。每个参数必须有显式类型:
fun powerOf(number: Int, exponent: Int) { /*……*/ }
默认参数 name: type=
fun read(b: Array<Byte>, off: Int = 0, len: Int = b.size) { /*……*/ }
默认值通过类型后面的 = 及给出的值来定义。
覆盖方法,总是默认覆盖原来默认参数,不能书写默认参数。
函数调用
//调用函数默认参数情况,
fun foo(bar: Int = 0, baz: Int) { /*……*/ }
//位置参数调用:默认参数在前的情况1
foo(baz = 1) // 使用默认值 bar = 0
fun foo(bar: Int = 0, baz: Int = 1, qux: () -> Unit) { /*……*/ }
//默认参数在前的情况2
foo(1) { println("hello") } // 使用默认值 baz = 1
foo(qux = { println("hello") }) // 使用两个默认值 bar = 0 与 baz = 1
//多参数,具名参数情况
fun reformat(str: String,
normalizeCase: Boolean = true,
upperCaseFirstLetter: Boolean = true,
divideByCamelHumps: Boolean = false,
wordSeparator: Char = ' ') {
/*……*/
}
//默认调用
reformat(str, true, true, false, '_')
//增加可读性可采用具名参数 调用
reformat(str,
normalizeCase = true,
upperCaseFirstLetter = true,
divideByCamelHumps = false,
wordSeparator = '_'
)
//如果我们不需要所有的参数:可以巧妙的直接传入需要更改的参数
reformat(str, wordSeparator = '_')
//特殊情况,传入需要更改的情况时候,所有位置参数放在具名参数之前
f(1, y = 2) √
f(x = 1, 2) ×
无意义返回值:Unit
返回无意义类型 void,或者无返回值:
fun printSum(a: Int, b: Int): Unit {
println("sum of $a and $b is ${a + b}")
}
函数多种写法
基本:变量类型写变量的后面,
fun sum(a: Int, b: Int): Int {
return a + b
}
利用类型推断,省略返回值类型书写:
fun sum(a: Int, b: Int) = a + b
中缀函数 infix
中缀函数,一种表示方法,忽略该调用的点与圆括号
例如:
infix fun Int.shl(x: Int): Int { …… }
// 用中缀表示法调用该函数
1 shl 2
// 等同于这样
1.shl(2)
infix调用的优先级:
- 低于算术操作符、类型转换以及
rangeTo
操作符 - 高于布尔操作符
&&
与||
、is-
与 `in-检测以及其他的操作符
使用范围
函数作用域
支持成员函数,局部函数
局部函数,可以访问闭包,上一层函数的局部变量;
成员函数:可以直接通过实例、类.方法调用
Sample().foo() // 创建类 Sample 实例并调用 foo
尾部递归函数:tailrec
当一个函数用 tailrec
修饰符标记并满足所需的形式时,编译器会优化该递归,留下一个快速而高效的基于循环的版本:
使用条件:
要符合 tailrec
修饰符的条件的话,函数必须将其自身调用作为它执行的最后一个操作。在递归调用后有更多代码时,不能使用尾递归,并且不能用在 try/catch/finally 块中。
优点:允许一些通常用循环写的算法改用递归函数来写,而无堆栈溢出的风险。
eg:
val eps = 1E-10 // "good enough", could be 10^-15
tailrec fun findFixPoint(x: Double = 1.0): Double
= if (Math.abs(x - Math.cos(x)) < eps) x else findFixPoint(Math.cos(x))
相当于:
val eps = 1E-10 // "good enough", could be 10^-15
private fun findFixPoint(): Double {
var x = 1.0
while (true) {
val y = Math.cos(x)
if (Math.abs(x - y) < eps) return x
x = Math.cos(x)
}
}
参考链接:
https://www.kotlincn.net/docs/reference/lambdas.html
原文地址:https://www.cnblogs.com/liguo-wang/p/12981014.html
- 切片的内部实现
- go interface
- 使用Spark MLlib给豆瓣用户推荐电影
- hadoop,hbase,hive,zookeeper版本整合兼容性最全,最详细说明【适用于任何版本】
- centos7:SSH公钥无密码认证
- Spark机器学习API之特征处理
- hadoop入门:第十章hadoop工具
- hive文件存储格式:SequenceFile系统总结
- openshift镜像构建-s2i环境变量设置
- Go Channel 源码剖析
- 再谈谈获取 goroutine id 的方法
- Golang方法和接口
- Go队列和堆栈
- openstack【juno】入门高级篇:为何你的实例ping不通外网【详述】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 算法菜鸟的烂笔头
- 防火墙(iptables)
- 短视频商城源码,安卓几种弹窗方法
- Automl框架katib浅析
- NAS Network Attached Storage
- es6 随性学习之 字符串 String
- MongoDB内核:副本集选举过程分析
- MongoDB内核:主从同步之源码剖析
- OpenGL ES 帧缓冲区位块传送
- OAuth 2.0 单元测试解决方案
- 「性能提升」扩展 Spring Cache 支持多级缓存
- 如何以源码形式运行Nacos Server
- Spring Boot 2.4 配置文件将加载机制大变化
- OpenGL ES 多目标渲染(MRT)
- R包:gtable包用于处理ggplot2图像