Kotlin从入门到放弃(03day)

172 阅读2分钟

今晚继续攻坚Kotlin基础。

一、函数表达式

fun main(args: Array<String>) {
    
    var result1 = add1(2, 3)
    println(result1)

    var result2 = add2(2, 3)
    println(result2)

    //直接变量声明函数
    var i = {x:Int, y:Int -> x + y}
    println(i(2, 3))
    
    //直接变量声明函数
    var j:(Int, Int) -> Int = {x,y -> x + y}
    println(j(2, 3))

}

//普通的写法
fun add1(x:Int, y:Int) :Int {
    return  x + y
}

//当函数体只有一行时,{}可以省略
fun add2(x:Int, y:Int) :Int = x + y
运行结果如下:
5
5
5
5

二、字符串与整形之间转换

fun main(args: Array<String>) {
    var a = "8"
    var b = 8

    a = b.toString()

    b = a.toInt()

    var c = "a2"

    //报错
    b = c.toInt()
}
运行结果如下:
Exception in thread "main" java.lang.NumberFormatException: For input string: "a2"
	at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
	at java.lang.Integer.parseInt(Integer.java:580)
	at java.lang.Integer.parseInt(Integer.java:615)
	at KotlinStringTestKt.main(KotlinStringTest.kt:11)
	
	意思是"a2"不能转化为整形

三、控制台输入

如下示例演示了一个简易的加法的计算器:

fun main(args: Array<String>) {
    while (true) {
        println("请输入第一个整数:")
        var num1 = readLine()
        println("请输入第二个整数:")
        var num2 = readLine()
        
        //!!表示该数不为空
        var a:Int = num1!!.toInt()
        var b:Int = num2!!.toInt()
    
        println("$a + $b = ${a + b}")
    }
}

执行结果如下:

四、异常处理

上面控制台输入的例子中,当用户输入一个字符串时,字符串在执行加法时就会抛出异常,这时我们怎么去捕获异常呢? 其实和java是一样的,都是try catch

import java.lang.Exception

fun main(args: Array<String>) {
    while (true) {
        println("请输入第一个整数:")
        var num1 = readLine()
        println("请输入第二个整数:")
        var num2 = readLine()
    
        try {
            //!!表示该数不为空
            var a:Int = num1!!.toInt()
            var b:Int = num2!!.toInt()
    
            println("$a + $b = ${a + b}")
        }catch (e :Exception) {
            println("输入有误!")
        }
    }
}

运行结果如下:

五、递归

1. 递归

计算7的阶乘:

fun main(args: Array<String>) {
    var a = 7
    println(" $a 的阶乘是:${fact(a)}")
}

fun fact(num:Int) :Int {
    return if (num == 1) 1
    else num * fact(num - 1)
}

运行结果如下:

2. 尾递归优化

计算累加的小例子:

    fun main(args: Array<String>) {
       var result = 0
       println(add(10, result))
   }

   fun add(num: Int, result: Int): Int {
       return if (num == 1) result + 1
       else add(num - 1, result + num)
   }

输入的10,运行结果是55,没问题

输入的100,运行的结果是5050,没问题

当输入很大的数时,比如100000.....

报错了,报错如下:

明显溢出了,该怎样优化呢?

修改代码如下:

  fun main(args: Array<String>) {
       var result = 0
       println(add(100000, result))
   }
   
   //加上tailrec字段,让计算机一直执行完成
   tailrec fun add(num: Int, result: Int): Int {
       return if (num == 1) result + 1
       else add(num - 1, result + num)
   }

结果如下:

705082704

六、总结

知识是一点点积累的,好记性不如烂笔头!

未完待续......