经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Kotlin » 查看文章
Kotlin基础篇(一)
来源:cnblogs  作者:伊莫笑  时间:2018/12/12 12:46:25  对本文有异议

写在前面:

   因为工作需要,目前转安卓开发,用的IDE是AS3.2版本,语言的话,用的是Kotlin。由于之前是做.NET的,没接触过这方面的东西,所以完全是小白一枚。所以想着开个博客,以此来记录自己的学习进度。光是环境搭建,自己琢磨了一上午,也上网百度,最后在一以前搞安卓开发的同事的帮助下,才完成环境的搭建。  

--------------------------------------------我是分割线----------------------------------------------------------

Kotlin基础语法

0、常量与变量

常量:用val关键字,只能赋值一次的变量

val 标识符:类型 = 初始化值

例如:val b:Int = 1

变量:用var关键字

例如:var a:Int = 1

变量与常量都可以没有初始化值,如果声明的时候不初始化,则必须声明变量类型,但是在引用前必须初始化。

  1. val c:Int
  2. c = 1

声明的时候也可以不声明类型,编译器支持自动类型判断。

  1. val d = 1 //系统自动判断变量类型为Int

 

1、函数定义

函数定义使用关键字fun,参数格式为:参数:类型

例如:fun sum(a:Int,b:Int):Int{return a+b}

上面的例子里定义的sum函数是有返回值的,返回值的类为Int。定义有返回值的函数的格式为: fun 函数名(参数一:类型):返回值类型{函数体}

上一个例子中,函数体是一个表达式,还可以简写成这种:

fun sum(a:Int,b:Int) = a + b

这种写法由于函数体是一个表达式,所以,函数的返回类型会自动推断出来。

但是,如果有public关键字的话,还得加上返回类型,例如:

  1. public fun sum(a:Int,b:Int):Int = a+ b

public方法必须明确给出返回类型。

如果是无返回值的函数,可以这样定义:

  1. fun sum(a:Int,b:Int):Unit{print( a + b)}

其实,对于返回Unit类型的函数,Unit可以省略不写,对于public函数同样,因此上面的例子也可以这样写:

  1. fun printSum(a:Int,b:Int){print( a + b)}
  2. public fun printSum(a:Int,b:Int){print( a + b)}

2、可变长参数函数

函数的变长参数可以用vararg关键字来标识。例如:

  1. fun vars(vararg a:Int){
  2. for(b in a){print(b)}
  3. }
  4. fun main(args:Array<String>){
  5. vars(1,2,3,4,5)
  6. }

上面的例子中定义了一个vars可变长参数函数,在调用的时候,该函数的参数为12345,这个函数输出12345.

 

3、匿名函数(lambda

 

  1. fun main(args:Array<String>){
  2. val sumLambda: (Int,Int) -> Int = {x,y -> x+y}
  3. printIn(sumLambda(1,1)) //输出2
  4. }

 

以上实例中,sumLambda是一个匿名函数,也就是一个lambda表达式,

(Int,Int)是它的参数列表,->后面的Int返回类型,x+y是函数体。

 

sumLambda还可以这样来定义:

 

  1. val sumLambda: (Int,Int) -> Int = fun(x:Int,y:Int) = x+y

 

也可以这样:

  1. val sumLambda = fun(x:Int,y:Int) = x+y

因为匿名函数已经定义好了参数列表和返回类型,所以可以省略sumLambda的类型声明。

 

4、字符串模板

$表示一个变量名后者变量值,$varName表示变量值,${varName.fun()}表示变量的方法返回

 

  1. var a = 1
  2. var s1 = a is $a //s1的值为“a is 1”
  3. a = 2
  4. val s2 = ${s1.replace(“ is ”, was ”)}, but now is $a //s2的值为“a was 1,but now is 2”

 

如果要在字符串中包含$符号,需要对其进行转义,转义符号‘\’。

 

  1. val a = 5
  2. val name = Mike
  3. println(“$name have $a\$s”) //输出Mike have 5$s

 

5、Null检查机制

 

Kotlin的空安全设计对于声明可为空的参数,在使用时需进行空判断处理,有两种处理方式:

 

字段后加”!!”

  1. val a:String? = ""
  2. val b = a!!.toInt() //这将会抛出空指针异常
  3. print(b)

运行如下:

另一种字段后加?可不做处理,返回值为null或配合?:做空判断处理

 

  1. val a:String? = "1"
  2. val b = a?.toInt()
  3. println("$b")
    //配合?:做空判断处理
    val c = a?.toInt?:-1
    print(c)  //如果a?.toInt()为null,则输出-1

 

PS:我这里试过让a的值为空,但是输出的时候还是会抛出空指针异常,网上找过原因,还没找到,不知道有没有大神来指点一下。

7、类型检测及自动类型转换

要检测一个表达式时候某类型可以使用is运算符

 

  1. fun addition_isCorrect() {
  2. assertEquals(4, 2 + 2)
  3. val b = getStringLength(2)
  4. println("$b")
  5. }
  6. fun getStringLength(obj:Any):Int?{
  7. if (obj is String)
  8. {
  9. //做过类型判断之后,obj会被系统自动转换为string类型
  10. return obj.length
  11. }else
  12. {
  13. return null
  14. }
  15. }

 

上面的实例中,返回值为null

 

  1. fun addition_isCorrect() {
  2. assertEquals(4, 2 + 2)
  3. val b = getStringLength("2")
  4. println("$b")
  5. }
  6. fun getStringLength(obj:Any):Int?{
  7. if (obj is String && obj.length > 0)
  8. {
  9. //做过类型判断之后,obj会被系统自动转换为string类型
  10. return obj.length
  11. }
  12. return null
  13. }

 

这个实例返回的是1,在&&运算符的右侧,obj的类型会被自动转换为string

 

8、区间

区间的表达式由具有操作符的 . . rangeTo函数辅以in!in形成。区间是为任何可比较类型定义的,但对于整型原生类型,它有一个优化的实现。

 

 

 

 

  1. for (i in 1..4) print(i) //输出1234
  2.  
  3. for (i in 4..1) print(i) //什么都不会输出
  4. val i = 3
  5. if(i in 1..10){ //同 1<=i && i<=10
  6. println(i)
  7. }
  8. //还有step指定步长
  9. for (i in 1..4 step 2) print(i) //输出13
  10. //如果要倒序,可以用downTo
  11. for (i in 4 downTo 1) print(i) //输出4321
  12. //还可以使用until用来排除结束元素
  13. for (i in 1 until 4) print(i) //输出123 

 ==========================================================

插入代码的时候选择编程语言,没有kotlin……

以上都是在菜鸟教程里头学习的,感兴趣的也可以去Kotlin官网了解。

另,对于Kotlin方面,完全是小白一枚,目前自学ing

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号