Kotlin是一个用于现代多平台应用的静态编程语言,于2011年7月由  JetBrains 开发,这是一个基于JVM上运行的新语言;kotlin 语言是对 Java 语言的优化和封装,语法上有很多相似的地方,它们之间可以相互调用;kotlin 语言可以运用到 Web 前端开发、Web 后端开发、Android 移动端开发、server 脚本开发和桌面游戏开发这5类使用场景;所以学习 kotlin 语言是很有必要的,下面对它的语法进行探索。

1、kotlin 语言的变量和输出

1、1 变量

在程序运行过程中,随时可能会产生一些临时数据,应用程序将这些数据保存到一些内存单元,这些内存单元叫变量;变量包括变量名、 变量类型 和变量值;它的作用是用来存储一个数据,给这个数据起个名字方便开发人员使用该变量,它类似于容器;其中 var 声明的变量可读可写,val 声明的变量只可读。

常见的变量类型有8种

Byte   存储值范围 整数 -128~127

Short   存储值范围 整数 -32768~32767

Int   存储值范围 整数 -2147483648~2147483647

Long 存储值范围 整数 -9223372036854775807~9223372036854775807

Float   存储值范围 小数,小数点可以精确到6位

Double   存储值范围 小数,小数点可以精确到15-16位

String   存储值范围 字符串,用""双引号引起来的字符串都可以存

Boolean 存储值范围 布尔值,有2个,为 true 和 false

下面用代码对8中变量类型显式声明,举个例子:

ps:在 AndroidStudio 上写的代码

var b:Byte = 123var s:Short = 32766var i:Int = 2var l:Long = 46Lvar f:Float = 47Fvar d:Double = 90.478326548359783var s2:String = "你好"var b2:Boolean = false

以上有些类型编译器容易自动推断,可隐式声明

/*** 编译器推断为 Int型*/var i2 = 2/*** 编译器推断为 Long 型*/var l2 = 46L/*** 编译器推断为 Float 型*/var f2 = 47F/*** 编译器推断为 Double 型*/var d2 = 90.478326548359783/*** 编译器推断为 String 型*/var s4 = "你好"/*** 编译器推断为 Boolean 型*/var b3 = false

1、2 输出

kotlin 的输出其实就是在控制台上输出一些内容,也就是打印,下面列举代码举例:

/*** 在控制台上输出 你好,不换行*/print("你好")/*** 在控制台上输出 你好,换行*/println("你好")

2、函数和函数式表达式

2、1 函数

函数是计算机执行命令的单元,描述的是行为,一般指的是对象所有可以被执行的行为或者动作;也可以理解为计算机里的函数是程序执行的小片段,这些小片段可以有机的组合在一起完成业务功能;它可以有返回值或者无返回值,可以有参数或者没有参数,用 fun 关键字声明;下面举一个例子:

/*** 这是一个无参数无返回值的函数*/fun function1() {println("这是一个无参数无返回值的函数")}/*** 这是一个有2个参数无返回值的函数;* 2个参数分别为String和Int类型*/fun function2(s: String,i: Int) {println("这是一个有2个参数无返回值的函数")}/*** 这是一个无参数有返回值的函数;* 返回值类型为Int型*/fun function3():Int{println("这是一个无参数有返回值的函数")return 1}/*** 这是一个有2个参数有返回值的函数;* 2个参数分别为String和Int类型;* 返回值为Int型*/fun function4(s: String,i: Int):Int{println("这是一个有2个参数有返回值的函数")return 1}

2、1 函数式表达式

函数式表达式是一个代码量很少的函数的一种简化,类似 Java 中的 Lambda 表达式,也就是函数中只有一条语句且是返回值语句时,可以省略 return 关键字写成函数式表达式;下面列举一下函数可以写成函数式表达式的例子。

(1)有 fun 关键字的函数式表达式。

/*** 定义有2个参数返回值为1的函数 function(x:Int,y:Int)*/fun function(x:Int,y:Int):Int = 1

(2)无 fun 关键字的函数式表达式。

/*** 这里可以理解成 定义函数名为 i,* 2个 Int 类型的参数 x 和 y,* 返回值为 Int 类型且返回值为 x*y 的函数*/var i = {x:Int,y:Int -> x*y}var result = i(3,5)println(result)/*** 这里和 定义 i 函数也是一样的理解*/var j:(Int,Int)->Int = {x,y ->x*y}var result2 = j(3,5)println(result2)

3、字符串

3、1 字符串模板

字符串字面值可以包含模板表达式,即一些小段代码,会求值并把结果合并到字符串中;模板表达式以美元符 $ 开头,或者用花括号 ${}括起来的任意表达式;下面举个例子:

var i:Int = 4var s:String = "公园"/*** i 求值为4并把4合并到字符串中*/var s2:String = "今天我赚了${i}块钱"/*** s 求出为String类型值“公园”并把“公园”合并到字符串中*/var s3:String = "如果明天不下雨,我们就去${s}玩"

3、2 字符串的比较

这里说的字符串比较,是对比2个字符串的内容是否相等,而不是对比2个字符串是不是同一个对象,它的写法有3种,下面举个例子:

var s4:String = "hello World"var s5:String = "hello world"/*** b 为 false*/var b:Boolean = s4 == s5/*** b2 为false*/var b2:Boolean = s4.equals(s5)/*** b3 为true,参数为true,表示不用区分字母的大小写*/var b3:Boolean = s4.equals(s5,true)

4、kotlin 的空值

kotlin 中的 null,它也是值,表示没有数据,没有东西;下面用 String 类型的变量举个例子:

/*** 在类型后面加个? ,表示允许该类型变量为null*/var s:String? = nullvar s2:String = "你好"/*** 这里 s3的值为 你好null*/var  s3:String = s2 + s

5、when 表达式

在 Java 中,我们更多习惯用的是 switch/case 的模式,但是 switch/case 支持的类型非常少,用起来也有一些局限性;在 kotlin中,引入了 when 表达式,它能完全取代 switch/case,并且还有很多新的特性;when 表达式它是在给定条件基础上,满足什么条件就执行什么条件;下面对于不同情况下的 when  表达式举例子。

(1)when 表达式的一般用法

var num:Int = 3when(num) {/*** 这里如果满足3,就执行3的语句,执行完之后就跳出循环,相等于* Java中的 case 3: break*/3 -> println("当前数字为" + num)2 -> println("当前数字为" + num)1 -> println("当前数字为" + num)/*** 这里面的else等同于Java的switch/case中的default*/else -> println("当前数字不为1 、2、3")}

(2)when 表达式还可以写成自变量自动转型类型

var appCompatActivity: AppCompatActivity = MainActivity()when(appCompatActivity) {is MainActivity -> println("当前对象是MainActivity类型的")is Test -> println("当前对象是Tets类型的")else -> println("当前对象是其他类型的")}

(3)when 表达式还可以写成没有自变量的类型

var s2:String = "你好"var i2:Int = 3when {s2 == "哈哈" -> println("s2 的内容为 哈哈")i2 == 3 -> println("i2 的值为 3")else -> println("其他输出")}

(4)when 表达式还可以有返回值且返回值不允许出现 return 关键字

var num2:Int = 3/*** 1、when 表达式中的每一条执行语句的返回值类型必须一致,即 num2 和 0 是Int类型;* 2、接收返回值的变量类型必须与when 中执行语句返回值的类型一致,即num2 和 result类型一致*/var result:Int = when(num2) {3 -> {println("当前的返回值为3")num2}else -> {println("当前的返回值为0")0}}

6、Range 和 for 循环

6、1 Range

Range 是 Kotlin 相对 Java 新增的一种表达式,它表示的是值的范围,类似于数学中的区间,区间里面的数一定是 Int 类型的。它的写法有4种:

(1) 数值1 .. 数值2,表示数值1到数值2的范围(包括数值1和数值2在里面);

(2) A1 unti A2,表示 A1 到 A2-1 的范围(包括 A1 但不包含 A2 在里面);

(3) A2 downTo A1,表示 A1 .. A2 的倒序(A2 > A1);

(4)A1 .. A2 step N,表示从A1开始取数,每隔 N 个数就取数,直到这个数不在 A1 和 A2 的范围内;

下面对它的语法进行举例:

/*** 区间[1,10),不包含10在里面*/var ia:IntRange = 1 until 10/*** 区间[1,10],包含1 和 10*/var ia2:IntRange = 1 .. 10/*** 倒叙区间[10,1],包含10 和 1*/val intRangeReverse = 10 downTo 1/*** 区间步长取数,从区间[1,10]取数,从1开始,每隔 3个数就取出一个,最终这个数不在* 区间内就算取完最终区间里存放的数为 1,4,7,10*/var ia3 = 1 .. 10 step 3/*** 将 [1,10] 这个区间的数进行倒序,即[10,1]*/var ia4 = ia2.reversed()/*** 获取区间[1,10]中的数量*/var num:Int = ia2.count();

6、2 for 循环

for 循环的作用是遍历一个集合的元素,使其一个个的取出来使用,for 循环的括号里用关键字 in。

下面进行举例子:

/*** 定义一个Int类型的数组*/var ia:IntArray = intArrayOf(1,2,3,4,5)/*** 用for循环遍历Int类型的数组*/for (i in ia) {println("i = " + i)}

7、List 和 Map

7、1 List

List 就是一个存储数据的列表,类似 Java中的List;构造 List 的函数如下所示:

(1)listOf(),表示构造一个空的 List;

(2)listOf(A),表示构造有一个数据的 List;

(3)listOf(A,B,C,...)表示构造多个数据的 List

下面用代码举个例子:

/*** 构造一个没有数据的List*/var list: List<String> = listOf()/*** 构造一个只有一个数据的List*/var list2: List<String> = listOf("A")/*** 构造多个数据的List*/var list3: List<String> = listOf("A", "B", "C")

7、2 Map

Map 类似一个词典,词有索引,索引对应具体的内容,和 Java 中的 Map 类似构造 Map 的方法如下所示:

(1)mapOf(): 该函数返回不可变的 Map 集合
(2)mutableMapOf():  该函数返回可变的 MutableMap 集合
(3)hashMapOf():  该函数返回可变的 HashMap 集合
(4)linkedMapOf(): 该函数返回可变的 LinkedHashMap 集合
(5)sortedMapOf():  该函数返回可变的 TreeMap 集合
(6)TreeMap<K,V>():该函数返回可变的 TreeMap 集合

下面用代码对构造 Map 举个例子:

val map = mapOf("Android" to 56, "Kotlin" to 78, "C" to 74)println("mapOf() 的实际类型是:${map.javaClass}")val mutableMap = mutableMapOf("Android" to 56, "Kotlin" to 78, "C" to 74)println("mutableMapOf() 的实际类型是:${mutableMap.javaClass}")val hashMap = hashMapOf("Android" to 56, "Kotlin" to 78, "C" to 74)println("hashMapOf() 的实际类型是:${hashMap.javaClass}")val linkedMap = linkedMapOf("Android" to 56, "Kotlin" to 78, "C" to 74)println("linkedMapOf() 的实际类型是:${linkedMap.javaClass}")val treeMap = sortedMapOf("Android" to 56, "Kotlin" to 78, "C" to 74)println("sortedMapOf() 的实际类型是:${treeMap.javaClass}")var treeMap2 = TreeMap<String,Int>()treeMap2["Android"] = 56treeMap2["Kotlin"] = 78treeMap2["C"] = 74println("TreeMap<String,Int>() 的实际类型是:${treeMap2.javaClass}")

Map 的数据取出是用 for 循环一个个的遍历,它的写法如下所示:

(1)for (entry in map.entries) {  },for-in 遍历,遍历的是 Entry;

(2)for (key in map.keys) { },遍历 key,再通过 key 获取 value;

(3)for ((key, value) in map) { },for-in 遍历,key 和 value 同时遍历;

(4)map.forEach {  },forEach Lambda 表达式遍历;

下面用代码举个例子:

/*** for-in 遍历,遍历的是 Entry*/for (en in map.entries) {println("${en.key}: ${en.value}")}/*** 遍历 key,再通过 key 获取 value*/for (key in map.keys) {println("$key: ${map[key]}")}/*** for-in 遍历,key 和 value 同时遍历*/for ((key, value) in map) {println("$key: $value")}/*** forEach Lambda 表达式遍历*/map.forEach {println("${it.key}: ${it.value}")}

8、字符串和数字之间的转换

8、1 字符串转换成数字

字符串转换成数字成功的前提是字符串里面的内容必须是数值,不能有其他符号,它的转换方式为:字符串对象.toInt(),下面举个例子:

var s:String = "123"/*** 这里可以转换成为数字,因为s的内容都是数值*/var num:Int = s.toInt()var s2:String = "12s"/*** 会报错;* 这里不可以转换成为数字,因为s2的内容不都是数值,含有s字符*/var num2:Int = s2.toInt()

8、2 数字转换成字符串

数字转换成字符串没有条件限制,它的转换方式为:Int类型对象.toString(),下面举个例子:

var num3:Int = 4var s3:String = num3.toString()println("s3 = " + s3)


9、异常

在 kotlin 程序中,错误可能产生于程序员没有预料到的各种情况,或者超出程序员可控范围的环境,例如试图打开一个不存在的文件,程序中就会运行出错;为了防止出现这种情况,我们必须要引用 kotlin 语言中的异常类;Kotlin 中所有异常类都是 Throwable 类的子孙类。 每个异常都有消息、堆栈回溯信息和可选的原因。

kotlin 中的捕获异常是由 try{}catch(e: Exception){}finally{} 语句组成,其中 catch 和 finally 至少要有一个存在,finally 不是必须的,可写可不写,不管程序是否捕获到异常,finally 里的代码块都会被执行,catch 代码块是处理异常的;下面进行代码举例:

var s: String? = nulltry {/*** 这里的s是null值,会产生空指针异常*/var b:Boolean = s.equals("123")} catch (e: Exception) {println("执行了catch代码块,因为s为null值")}finally {println("不管s是不是null值都会执行了finally代码块")}

本篇文章写到这里就结束了,由于技术水平有限,文章中难免会有错误,欢迎大家批评指正,另外附上demo地址:https://github.com/Yubao1/KotlinBasis.git

关注微信公众号,文章

kotlin语言的基础语法相关推荐

  1. Xamarin XAML语言教程基础语法篇大学霸

    Xamarin XAML语言教程基础语法篇大学霸 前  言 Xamarin是一个跨平台开发框架.它可以用来开发iOS.Android.Windows Phone和Mac的应用程序.使用Xamarin框 ...

  2. (五)Kotlin简单易学 基础语法-初始函数(下)

    (五)Kotlin简单易学 基础语法-初始函数(下) 函数内联 ➢ lambda可以让你更灵活的编写应用,但是,灵活也要付出代价的. ➢在JVM上,你定义的lambda会以对象实例的形式存在,JVM会 ...

  3. FPGA笔记之verilog语言(基础语法篇)

    文章目录 FPGA笔记之verilog语言(基础语法篇) 1. verilog 的基础结构 1.1 verilog设计的基本单元--module 1.2 module的使用 1.3 I/O的说明 1. ...

  4. (二十三)Kotlin简单易学 基础语法-什么是函数式编程

    (二十三)Kotlin简单易学 基础语法-什么是函数式编程 什么是函数式编程 我们一直在学习面向对象编程范式,另一个较知名的编程范式是诞生于20世纪50年代,基于抽象数学的λ演算发展而来的函数编程,尽 ...

  5. Go语言学习二 语言结构 基础语法 数据类型

    Go 语言结构 由 youj 创建, 最后一次修改 2015-09-08 Go 语言结构 在我们开始学习 GO 编程语言的基础构建模块前,让我们先来了解 Go 语言最简单程序的结构. Go Hello ...

  6. 学习 Go 语言 1 — 基础语法

    文章目录 一.第一个 Go 程序 二.基本程序结构 2.1 变量与常量 2.2 数据类型 2.3 运算符 2.4 条件和循环 三.常用数据结构 3.1 数组 3.2 切片 3.3 集合 3.4 字符串 ...

  7. Go语言入门--基础语法

    Go语言入门系列文章目录 Go语言入门–基础语法 Go语言入门–流程语句 Go语言入门–数组和切片 集合(Map)(咕咕咕

  8. 关于JS脚本语言的基础语法

    JS脚本语言的基础语法:输出语法  alert("警告!");  confirm("确定吗?");   prompt("请输入密码");为弱 ...

  9. Kotlin 开篇之基础语法篇

    文章目录 前言 Kotlin 基础 1. 函数声明 1.1 表达式函数体 1.2 函数调用 2. 变量 2.1 可变变量和不可变量 2.2 引用变量值 2.3 空安全 3. 基础类型 3.1 数字类型 ...

最新文章

  1. FPGA 时序约束系列之周期约束
  2. NYOJ题目1048破门锁
  3. 进度管理计划7个过程及相关重点
  4. Jlink无法识别CPU/lpc2103/lpc2131
  5. ThinkPHP 的URL重写时遇到No input file specified的解决方法
  6. 【BZOJ2326】【codevs2314】数学作业,第100篇博文纪念
  7. es用python增加字段_使用Python在ElasticSearch中添加@timestamp字段
  8. geoiplookup命令没有任何输出问题
  9. java 异步 阻塞io_非阻塞IO与异步IO以及Java实现
  10. ubuntu22.04编译opengl编程指南示例
  11. weibinv matlab,利用MATLAB进行夫琅和费衍射
  12. 学习java 的第一节课
  13. 扫一扫就可一键叫车 杭州暖心车站让老人去往生活里的远处
  14. python求一元三次方程的根_一元高次方程寻根记杂谈
  15. IE和谷歌浏览器区分
  16. 腾讯云MySQL备份本地恢复
  17. Unity快速实现回合制游戏
  18. 【POJ 2484】A Funny Game(对称博弈)
  19. 关于Ubuntu20.04下向日葵远程软件连接中断的解决方法
  20. DBA运维工具-OLazy

热门文章

  1. Vert.x简介、原理与HelloWorld
  2. 在线一键将手写文字转为可编辑的文字技巧
  3. 中标丨英伟达Jetson 边缘计算模块申购、中国电信5G边缘计算应急通信车购置工程等...
  4. ROS通信编程_动作编程_定义cation文件
  5. 苹果手机数据传输软件哪个好
  6. 苹果手机无线连接xocde
  7. 优化微信小程序音频播放,实现多音频同时播放,互不干扰。
  8. IE10不显示swfupload上传附件按钮问题
  9. 一台数控恒流恒压电源的制作
  10. 蚂蚁迷呀 (附源码)