Kotlin Primer·第二章·基本语法
Kotlin 程序是什么样子的?如果浏览过本书,你会看到许多例子。很有可能你觉得 Kotlin 语言有点古怪,充满了var field: String
这样的语法。然而读完本章后,你将不再对这些语法感到陌生,甚至很可能喜欢上它们。
2.1 变量
让我们来看一个很简单的程序。
fun main(args: Array<String>) {var quantity = 5val price: Double = 20.3val name: String = "大米"println("单价:$price")println("数量:$quantity")println("产品:$name 总计:${quantity * price}")
}
上面的代码中,首先创建了一个名为quantity
的变量用以表示产品的数量,并初始化为 5。
一个值为 20.3 的常量price
,用来表示产品的单价。
一个表示产品名字的字符串常量name
。
通过这段代码我们可以看到,Kotlin 语言声明一个变量使用关键字var
,声明一个常量使用val
,声明时 Kotlin 语言是可以自动推测出字段类型的,例如上面代码中的var quantity = 5
会被认为是Int
类型,但如果你希望它是一个Double
类型,则需要显示声明类型,例如var quantity: Double = 5
。
2.2 语句
2.2.1 in关键字的使用
判断一个对象是否在某一个区间内,可以使用in关键字
//如果存在于区间(1,Y-1),则打印OK
if (x in 1..y-1) print("OK")//如果x不存在于array中,则输出Out
if (x !in 0..array.lastIndex) print("Out")//打印1到5
for (x in 1..5) print(x)//遍历集合(类似于Java中的for(String name : names))
for (name in names)println(name)//如果names集合中包含text对象则打印yes
if (text in names)print("yes")
2.2.2 when表达式
类似于 Java 中的 switch,但是 Kotlin 更加智能,可以自动判断参数的类型并转换为响应的匹配值。
fun cases(obj: Any) { when (obj) {1 -> print("第一项")"hello" -> print("这个是字符串hello")is Long -> print("这是一个Long类型数据")!is String -> print("这不是String类型的数据")else -> print("else类似于Java中的default")}
}
2.2.3 智能类型推测
判断一个对象是否为一个类的实例,可以使用is关键字
与 Java 中的instanceof
关键字类似,但在 Kotlin 中如果已经确定了一个对象的类型,可以在接下来的代码块中直接作为这个确定类型使用。
fun getStringLength(obj: Any): Int? {if (obj is String) {// 做过类型判断以后,obj会被系统自动转换为String类型return obj.length }//同时还可以使用!is,来取反if (obj !is String){}// 代码块外部的obj仍然是Any类型的引用return null
}
2.2.4 空值检测
Kotlin 是空指针安全的,也就意味着你不会再看到那恼人的空指针异常。
例如这句代码 println(files?.size)
,只会在files
不为空时执行。
以及,你可以这样写
//当data不为空的时候,执行语句块
data?.let{//...
}//相反的,以下代码当data为空时才会执行
data?:let{//...
}
2.3 函数
2.3.1 函数的声明
函数使用关键字fun
声明,如下代码创建了一个名为say()
的函数,它接受一个String
类型的参数,并返回一个String
类型的值
fun say(str: String): String {return str
}
同时,在 Kotlin 中,如果像这种简单的函数,可以简写为
fun say(str: String): String = str
如果是返回Int
类型,那么你甚至连返回类型都可以不写
fun getIntValue(value: Int) = value
2.3.2 函数的默认参数
你也可以使用默认参数来实现重载类似的功能
fun say(str: String = "hello"): String = str
这时候你可以调用say()
,来得到默认的字符串 "hello"
,也可以自己传入参数say("world")
来得到传入参数值。
有时参数非常多的时候,也可以使用多行参数的写法,它们是相同的
fun say(firstName: String = "Tao",lastName: String = "Zhang"){
}
2.3.3 变参函数
同 Java 的变长参数一样,Kotlin 也支持变长参数
//在Java中,我们这么表示一个变长函数
public boolean hasEmpty(String... strArray){for (String str : strArray){if ("".equals(str) || str == null)return true;}return false;
}//在Kotlin中,使用关键字vararg来表示
fun hasEmpty(vararg strArray: String?): Boolean{for (str in strArray){if ("".equals(str) || str == null)return true }return false
}
2.3.4 扩展函数
你可以给父类添加一个方法,这个方法将可以在所有子类中使用
例如,在 Android 开发中,我们常常使用这样的扩展函数:
fun Activity.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) {Toast.makeText(this, message, duration).show()
}
这样,我们就可以在每一个Activity
中直接使用toast()函数了。
2.3.5 将函数作为参数
Kotlin 中,可以将一个函数作为参数传递给另一个函数
kotlin fun lock<T>(lock: Lock, body: () -> T ) : T { lock.lock() try { return body() } finally { lock.unlock() } }
上面的代码中,我们传入了一个无参的 body() 作为 lock() 的参数,
2.4 小结
最后,我们用一段代码来总结本章内容,你能看懂吗?
fun main(args: Array<String>) {val firstName: String = "Tao"val lastName: String? = "Zhang"println("my name is ${getName(firstName, lastName)}")
}fun hasEmpty(vararg strArray: String?): Boolean {for (str in strArray) {str ?: return true}return false
}fun getName(firstName: String?, lastName: String? = "unknow"): String {if (hasEmpty(firstName, lastName)) {lastName?.let { return@getName "${checkName(firstName)} $lastName" }firstName?.let { return@getName "$firstName ${checkName(lastName)}" }}return "$firstName $lastName"
}fun checkName(name: String?): String = name ?: "unknow"
Kotlin Primer·第二章·基本语法相关推荐
- 【JAVA SE】第二章 Java语法基础、数据类型、基本类型的字面值、基本类型的类型转换和运算规则
第二章 Java语法基础.数据类型.基本类型的字面值.基本类型的类型转换.运算规则和标识符命名风格 文章目录 第二章 Java语法基础.数据类型.基本类型的字面值.基本类型的类型转换.运算规则和标识符 ...
- LLVM 极简教程: 第二章 实现语法分析器和AST
第二章 实现语法分析器和AST 原文: Implementing a Parser and AST 本章简介 欢迎进入"用LLVM开发新语言"教程的第二章.在本章中,我们将以第一章 ...
- 第二章----基本语法
第二章:基本语法 1.关键字和保留字 2.标识符 2.1.标识符的使用 2.2.标识符的命名规则 2.3.标识符的命名规范 3.变量 3.1.变量分类 3.2.整数类型:byte.short.int. ...
- JSP实用教程第二章-JSP语法
目录 前言 2.1 JSP页面的基本结构 2.2声明变量和定义方法 2.2.1 声明变量 2.22 定义方法和类 2.3Java程序片 2.4Java表达式 2.5 JSP中的注释 2.6 JSP指令 ...
- JSP实用教程——第二章JSP语法
目录 2.1 JSP页面的基本结构 2.2 声明变量和定义方法 2.2.1 声明变量 2.2.2 定义方法和类 2.3 Java程序片 2.4 Java表达式 2.5 JSP指令标记 2.5.1 pa ...
- 《C语言陷阱与缺陷》第二章【语法陷阱】上
目录 ✊ 一.理解函数声明 ☝️ 二.运算符的优先级问题 ✌️ 三.注意作为语句结束标志的分号 ✊ 一.理解函数声明 先来看下面这条语句: (* (void(*) () ) 0 ) (); 这样的表达 ...
- 编译原理语法分析_斯坦福大学《编译原理》学习记录 - 第二章:语法分析器
05-01: Introduction to Parsing 语法分析 parser的作用: 05-02: Context Free Grammars 上下文无关文法 CFG(上下文无关文法)回答了一 ...
- C++ Primer 第二章 学习笔记及习题答案
知识点 基本内置类型 算数类型:整型(包括布尔型和字符型).浮点型.空类型. 空类型:不对应任何值,常用来当函数不返回任何值时使用空类型作为返回类型. 带符号类型和无符号类型:带符号类型可以表示正数. ...
- JSP实用教程——第二章:JSP语法
JSP基本语法 在传统的HTML页面文件中嵌入脚本语言和JSP标签就构成了一个JSP页面文件.一个JSP页面可有5中元素组合而成. HTML页面内容 JSP注释 JSP指令 JSP脚本元素 JSP动作 ...
- C++primer第二章2.4节对于const限定符相关内容进行详解
const限定符 const对象一旦创建后其数值就不会被再次改变,因此const对象必须初始化. const对象只在文件中有效 在不同的文件中使用不同的const来定义不同的常量,那么每个文件定义的变 ...
最新文章
- 线性回归、逻辑回归及SVM
- java 静态方法重写_Java 类中可以覆盖静态方法吗?
- pyinstaller深入使用,打包指定模块,打包静态文件
- oracle数据库多表嵌套,sql – 在oracle中更新多个嵌套表中的多个记录
- 【解决办法】No module named 'ahocorasick'
- (1).数据结构概述
- Java最后_Java最后一次总结
- 《软件测试技术》课程第二周随笔
- 从helloworld回顾程序的编译过程之二
- APP开发内容介绍(源代码)
- windows驱动开发技术详解 VC6与DDK搭配使用的设置
- java 类方法中this_Java Eclipse 中 在类与方法调用中 (this)的用法
- 某企业通达OA任意登录漏洞复现
- 安卓抖音怎么切换国际版Tiktok自带无水印下载
- android nef转jpg格式文件,nef格式转换成jpg
- 磁盘与文件系统管理--鸟哥私房菜读书笔记
- 【视觉高级篇】20 # 如何用WebGL绘制3D物体?
- 缺少vcruntime140d.dll的解决办法
- Aggressive cows-疯牛POJ(2456)-详解
- 微信小程序—调用imgSecCheck接口实现多张图片鉴黄,敏感过滤
热门文章
- 智慧校园人脸识别门禁系统设计方案
- 微分方程的Matlab解法
- AI行业“四小龙”里,谁最有巨头相?
- 3.0.0 alpha 重磅发布!九大新功能、全新 UI 解锁调度系统新能力
- ASO优化中关键词设置是否需要逗号,aso关键词逗号隔开
- 怎么测试ftp服务器上传文件,ftp服务器文件上传测试
- java日志系统框架整理(转载)
- python爬虫--爬取网易云音乐评论
- 港科夜闻|香港科技大学(广州)(筹)校长倪明选教授在北京拜访国家教育部党组书记、部长怀进鹏...
- 用线段树写Dijkstar