本篇文字主要记录Kotlin的基本知识及与Java对比所不同之处。
在kotlin中定义的变量都不允许为空,若想允许为空的变量需要在类型后面加"?",如:var str:String? = null
class NullDemo {
//参数不允许为null
fun noneNullTest(s : String){
println(s)
}
//参数允许为null
fun canNullTest(s:String?){
println(s)
}
}
与之相关操作符有:安全调用操作符(?.)
、非空断言操作符(!!.)
这两个操作符的作用:
?.
:在调用该变量的方法时,变量为null时代码停止,否则正常调用方法;
!!.
:在调用该变量的方法时,变量为null时,仍继续执行,此时会抛空指针异常;
//参数允许为null
fun canNullTest(s:String?){
println(s)
//s为null,停止执行
s?.capitalize()
//s为null,抛异常
s!!.capitalize()
}
a.无返回值
/**
* 无返回值的when表达式
*/
fun noneReturn(type:Int){
when(type){
1 -> {//有多行代码
println("这里有多行代码,加大括号")
println("这里有多行代码,加大括号")
}
2 -> println("只有一行代码,不用大括号") //只有一行代码,不用大括号
else -> println("其他情况")
}
}
b.when表达式有返回值
/**
* 带返回值的when表达式
*/
fun withReturn(type:Int){
var str = when(type){
1 -> {//有多行代码
println("这里有多行代码,加大括号")
println("这里有多行代码,加大括号")
"我是type=1时的返回值"
}
2 -> "我是type=2的返回值" //只有一行代码,不用大括号
else -> "我是其他情况的返回值"
}
println(str)
}
fun loopAndRange(){
var nums = 1 .. 16
//会输出1 2 3 ... 16
for (n in nums){
println(n)
}
var nums2 = 1 until 16
//会输出1 2,3 ... 15,不会输出16
for (n in nums2){
println(n)
}
//会输出1 3 5 7 9 11 13 15
for (n in nums step 2){
println(n)
}
}
针对list简单的循环
fun myList(){
val lists = listOf("1","2","3","4")
//简单的for循环,查询列表数据
for (item in lists){
println(item)
}
}
按索引值查询list
//按索引值查询
fun myList2(){
val lists = listOf("1","2","3","4")
//按位循环查询,包括索引和值
for ((i,v) in lists.withIndex()){
println("$i,$v")
}
}
###6、map的基本使用
与java相同,存储的key-value键值对
示例代码如下:
class MapDemo {
fun mapTest():Unit{
var map = HashMap()
map["1"] = "hello"
map["2"] = " "
map["3"] = "world"
//查询某个key对应的值
println("map[\"3\"] = ${map["3"]}")
//查询map中所有的键值对
for (kv in map){
println("key=${kv.key},value=${kv.value}")
}
}
}
函数写法示例代码
class FunctionDemo {
//方式一:方法定义
fun method(){
println("方式一:方法定义")
}
//方法二:若方法中代码仅有一行,可省略大括号,如下
fun method2() = println("方法二:若方法中代码仅有一行")
fun method3(){
//方法三:直接在方法里面定义,函数表达式的形式
var i = {x:Int,y:Int -> x+y}
var ret = i(1,2)
println(ret)
//方法四:是方法三的完善写法
var j:(Int,Int)->Int = {x,y -> x+y}
//j当做一个函数来使用
var retJ = j(1,2)
println(retJ)
}
}
在kotlin中函数参数支持设置默认值
//函数默认值
fun area(pi:Float=3.1415f,r : Float) : Float{
println("计算圆的周长----")
return 2 * r * pi
}
有参数带默认值的函数的使用方式:
area(3.14f,10f)
调用函数area(r=10f)
,即要将值传给的那个参数的名称数字转字符串
var a = 30
println(a.toString())
字符串转数字
var a = "30"
val b = a.toInt()
Kotlin中采用比较两个字符串是否匹配,用=比较两个变量是否指向内存堆上同一个对象(地址)。
Java中==进行引用比较,equal进行值比较
###11、控制台输入
从键盘输入采用:readLine()
fun inputTest(){
print("请输入一个数字:")
//从键盘输入内容,赋值给num变量
var num = readLine()
println()
}
###12、kotlin中异常处理机制
在kotlin中异常处理机制与java相同,也是采用try...catch
形式。
class ExceptionDemo {
//异常捕获方式
fun exceptionTest(){
val str = "aaa"
try {
var num = str.toInt()
}catch (e:Exception){
println("类型转换异常")
}finally {
}
}
}
自定义异常,定义一个class继承自Exception,如下示例:
class CustomException(string: String):Exception(string)
在java中递归计算时经常碰到栈溢出问题,在kotlin中也会碰到该问题,但是可以通过关键字tailrec
进行标识
注:有tailrec关键字标识的递归函数,return地方应该也要用该递归函数
//计算前n项求和
//关键字tailrec是进行尾递归优化标识
tailrec fun sum( n:Int,result:Int):Int{
if(n == 1) {
return result+1
}else{
//尾递归优化,return 值必须为递归方法,不可为:return n+sum(n-1,result)
//否则编辑器会提示:A function is marked as tail-recursive but no tail calls are found
return sum(n-1,result+n)
}
}
kotlin中空合并操作符(?:
)的作用类似Java中的条件表达式。
如:var str = a ?: b
该语句的意思是:当变量a不为null时,将a赋值给str;当变量a为null时,将变量b赋值给str
1.转整形
println(8.12345.toInt())
输出:8
2.转整形,四舍五入的方式
println(8.62345.roundToInt())
输出:9
3.保留指定小数位数(会四舍五入)
var s = “%.2f”.format(8.16678)
println(s)
输出:8.17
欢迎留言大家互相交流学习!
示例源码地址kotlin_demo