本篇文字主要记录Kotlin的基本知识及与Java对比所不同之处。
1、基础变量类型及取值范围
- Byte 存储值范围 整数 -2^8 ~ 2^8 -1,即-128 ~ 127;
- Short 存储值范围 整数 -2^16 ~ 2^16 -1,即-32768 ~ 32767;
- Int 存储值范围 整数 -2^32 ~ 2^32 - 1,即-2147483648 ~ 2147483647;
- Long 存储值范围 整数 -2^64 ~ 2^64 - 1,即-9223372036854775808 ~ 9223372036854775807;
- Float 存储值范围 小数,小数点后可精确到6位;
- Double 存储值范围 小数,小数点后可精确到15 ~ 16位;
- String 存储值范围 字符串 用“”双引号引起来的字符串都可以存储;
2、空值处理
在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()
}
3、when表达式
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)
}
4、kotlin中的loop和Range
- 1 … 100 表示从1到100,区间:[1,100];
- 1 until 100 表示从1到100,区间:[1,100),不包括100;
- step ,步长,即下一次循环跳跃的步长
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)
}
}
5、list基本使用
针对list简单的循环
fun myList(){
val lists = listOf<String>("1","2","3","4")
//简单的for循环,查询列表数据
for (item in lists){
println(item)
}
}
按索引值查询list
//按索引值查询
fun myList2(){
val lists = listOf<String>("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<String,String>()
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}")
}
}
}
7、函数和函数表达式
函数写法示例代码
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)
}
}
8、函数参数默认值和具名参数
在kotlin中函数参数支持设置默认值
//函数默认值
fun area(pi:Float=3.1415f,r : Float) : Float{
println("计算圆的周长----")
return 2 * r * pi
}
有参数带默认值的函数的使用方式:
- 不使用参数的默认值,通过该方式
area(3.14f,10f)
调用函数 - 使用参数的默认值,则必须使用具名参数,即参数中需要设置参数的名称,如:
area(r=10f)
,即要将值传给的那个参数的名称
9、字符串和数字之间的转换
数字转字符串
var a = 30
println(a.toString())
字符串转数字
var a = "30"
val b = a.toInt()
10、与=比较
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)
13、递归中的尾递归优化
在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)
}
}
14、空合并操作符( ?: )
kotlin中空合并操作符(?:
)的作用类似Java中的条件表达式。
如:var str = a ?: b
该语句的意思是:当变量a不为null时,将a赋值给str;当变量a为null时,将变量b赋值给str
15、Double转Int
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