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·第二章·基本语法相关推荐

  1. 【JAVA SE】第二章 Java语法基础、数据类型、基本类型的字面值、基本类型的类型转换和运算规则

    第二章 Java语法基础.数据类型.基本类型的字面值.基本类型的类型转换.运算规则和标识符命名风格 文章目录 第二章 Java语法基础.数据类型.基本类型的字面值.基本类型的类型转换.运算规则和标识符 ...

  2. LLVM 极简教程: 第二章 实现语法分析器和AST

    第二章 实现语法分析器和AST 原文: Implementing a Parser and AST 本章简介 欢迎进入"用LLVM开发新语言"教程的第二章.在本章中,我们将以第一章 ...

  3. 第二章----基本语法

    第二章:基本语法 1.关键字和保留字 2.标识符 2.1.标识符的使用 2.2.标识符的命名规则 2.3.标识符的命名规范 3.变量 3.1.变量分类 3.2.整数类型:byte.short.int. ...

  4. JSP实用教程第二章-JSP语法

    目录 前言 2.1 JSP页面的基本结构 2.2声明变量和定义方法 2.2.1 声明变量 2.22 定义方法和类 2.3Java程序片 2.4Java表达式 2.5 JSP中的注释 2.6 JSP指令 ...

  5. 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 ...

  6. 《C语言陷阱与缺陷》第二章【语法陷阱】上

    目录 ✊ 一.理解函数声明 ☝️ 二.运算符的优先级问题 ✌️ 三.注意作为语句结束标志的分号 ✊ 一.理解函数声明 先来看下面这条语句: (* (void(*) () ) 0 ) (); 这样的表达 ...

  7. 编译原理语法分析_斯坦福大学《编译原理》学习记录 - 第二章:语法分析器

    05-01: Introduction to Parsing 语法分析 parser的作用: 05-02: Context Free Grammars 上下文无关文法 CFG(上下文无关文法)回答了一 ...

  8. C++ Primer 第二章 学习笔记及习题答案

    知识点 基本内置类型 算数类型:整型(包括布尔型和字符型).浮点型.空类型. 空类型:不对应任何值,常用来当函数不返回任何值时使用空类型作为返回类型. 带符号类型和无符号类型:带符号类型可以表示正数. ...

  9. JSP实用教程——第二章:JSP语法

    JSP基本语法 在传统的HTML页面文件中嵌入脚本语言和JSP标签就构成了一个JSP页面文件.一个JSP页面可有5中元素组合而成. HTML页面内容 JSP注释 JSP指令 JSP脚本元素 JSP动作 ...

  10. C++primer第二章2.4节对于const限定符相关内容进行详解

    const限定符 const对象一旦创建后其数值就不会被再次改变,因此const对象必须初始化. const对象只在文件中有效 在不同的文件中使用不同的const来定义不同的常量,那么每个文件定义的变 ...

最新文章

  1. 线性回归、逻辑回归及SVM
  2. java 静态方法重写_Java 类中可以覆盖静态方法吗?
  3. pyinstaller深入使用,打包指定模块,打包静态文件
  4. oracle数据库多表嵌套,sql – 在oracle中更新多个嵌套表中的多个记录
  5. 【解决办法】No module named 'ahocorasick'
  6. (1).数据结构概述
  7. Java最后_Java最后一次总结
  8. 《软件测试技术》课程第二周随笔
  9. 从helloworld回顾程序的编译过程之二
  10. APP开发内容介绍(源代码)
  11. windows驱动开发技术详解 VC6与DDK搭配使用的设置
  12. java 类方法中this_Java Eclipse 中 在类与方法调用中 (this)的用法
  13. 某企业通达OA任意登录漏洞复现
  14. 安卓抖音怎么切换国际版Tiktok自带无水印下载
  15. android nef转jpg格式文件,nef格式转换成jpg
  16. 磁盘与文件系统管理--鸟哥私房菜读书笔记
  17. 【视觉高级篇】20 # 如何用WebGL绘制3D物体?
  18. 缺少vcruntime140d.dll的解决办法
  19. Aggressive cows-疯牛POJ(2456)-详解
  20. 微信小程序—调用imgSecCheck接口实现多张图片鉴黄,敏感过滤

热门文章

  1. 智慧校园人脸识别门禁系统设计方案
  2. 微分方程的Matlab解法
  3. AI行业“四小龙”里,谁最有巨头相?
  4. 3.0.0 alpha 重磅发布!九大新功能、全新 UI 解锁调度系统新能力
  5. ASO优化中关键词设置是否需要逗号,aso关键词逗号隔开
  6. 怎么测试ftp服务器上传文件,ftp服务器文件上传测试
  7. java日志系统框架整理(转载)
  8. python爬虫--爬取网易云音乐评论
  9. 港科夜闻|香港科技大学(广州)(筹)校长倪明选教授在北京拜访国家教育部党组书记、部长怀进鹏...
  10. 用线段树写Dijkstar