layout: post
title: "kotlin-程序结构2"
subtitle: "认命就是你和你的自尊心野心不甘心一起围着桌子坐下来 握手言和"
表达式
中缀表达式
- 调用时可以省去 . () 调用
- 只有一个参数,且用 infix 修饰的函数
class Paper(word: String) {
var word = word
}
class Pen {
infix fun on(paper: Paper) {
if (paper.word.isNotEmpty()) {
println("Pen on Paper write ${paper.word}")
} else {
println("Pen not on Paper")
}
}
}
fun main(args: Array<String>) {
var pen = Pen()
val paper = Paper("\"Hello infix\"")
pen on paper
}
if 表达式
- 在kotlin中 if 不只是分支语句还是表达式 if 是有返回值的
- 代码块内语句最后一行为返回值
val s:Int = if (paper.word.isEmpty()){
0
}else{
1
}
when 表达式
- 加强版的 switch ,支持任意类型
- 支持纯表达式条件分支(类似于 if)
例一
fun main(args: Array<String>) {
val x = 5
when (x) {
is Int -> println("Hello $x")
in 1..100 -> println("$x is in 1..100")
!in 1..100 -> println("$x is not in 1..100")
args[0].toInt() -> println("x == args[0]")
}
val mode = when {
args.isNotEmpty() && args[0] == "1" -> 1
else -> 0
}
}
例二
class Player {
enum class State {
IDLE, BUFFERING, PLAYING, PAUSED
}
private var state = State.IDLE
fun pause() {
when (state) {
Player.State.BUFFERING, Player.State.PLAYING -> doPause()
else -> {
}
}
}
fun resume() {
when (state) {
Player.State.PAUSED -> doResume()
}//什么都不做
}
private fun doResume() {
state = State.PLAYING
//处理真正的继续播放逻辑
}
private fun doPause() {
state = State.PAUSED
//处理真正的暂停逻辑
}
}
循环语句
for 循环
val listInt = listOf(1, 2, 4, 5)
for (i in listInt){
println(i)
}
跳过和终止循环
- continue : 跳过当前循环
- break : 终止循环
- 多层循环嵌套终止结合标签使用
val listInt = listOf(1, 2, 4, 5,7,9,23)
Outer@for (i in listInt){
println(i)
Inner@while (i>5){
break@Outer
}
}
异常捕获
- try catch 用法和Java一致
- finally 无论代码是否抛异常都会执行
try {
val arg1 = args[0].toInt() //1
val arg2 = args[1].toInt() //2a
println("$arg1 + $arg2 = ${sum(arg1, arg2)}")
}catch (e: NumberFormatException){
println("您确定输入的是整数吗?")
}catch (e: ArrayIndexOutOfBoundsException){
println("您确定输入的是两个整数吗?")
}catch (e: Exception){
println("程序出现了未知异常,可能是您的人品太差了.${e.message}")
}finally {
println("谢谢您使用我们的加法计算器")
}
具名参数
具名参数 : 给函数的实参附上形参
fun sum(args1:Int,args2:Int)=args1+args2
sum(args1=2,args2=3)//此时args2=3在前在后编译器都知道3是给args2的
变长参数
- 变长参数可以接收多个值
- 可以在参数列表的任意位置
- 若传参有歧义时 需用具名参数
fun main(vararg args: String) {
val list = arrayListOf(1,3,4,5)
val array = intArrayOf(1,3,4,5)
//*array 目前只支持数组 只用于变长参数列表展开数组
hello(3.0, *array)
}
fun hello(double: Double, vararg ints: Int, string: String = "Hello"){
println(double)
ints.forEach(::println)
println(string)
}
默认参数
- 为函数参数指定默认值
- 可以为任意位置的参数指定默认值
- 若传参有歧义时 需用具名参数
网友评论