Kotlin学习之起始篇—基础语法

Kotlin被Android接纳为官方语言已经一年多了,现在才开始学习,实在惭愧。希望能一点点进步,到最后能完全用Kotlin开发app。废话就不多说了。Let’s get started!

1. 定义包

package my.demo
import java.util.*
// ...

包名要放在源文件的开头位置,好像和Java没什么区别,除了末尾不用分号结束。这是KotlinJava的一大不同点,语句结束不用加分号

2. 定义函数

2.1 有参,有返回值函数

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

传入两个Int类型参数,返回Int数值。函数名前面要添加关键字fun。参数类型及返回值类型的定义方式和Java大不相同。

像这样的函数体只有一句表达式,返回值类型可自动推断的函数,可以简写如下:

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

2.2 有参,无返回值函数

fun printSum(a: Int, b: Int): Unit {println("sum of $a and $b is ${a + b}")
}

其中的关键字Unit类似于Java里面的void关键字。可以理解为返回一个无意义的值或者说无返回值。无返回值的函数还可以简写如下:

fun printSum(a: Int, b: Int) {println("sum of $a and $b is ${a + b}")
}

3. 定义变量

3.1 声明变量

var a: Int = 1
var b = 2

声明一个变量时必须使用var关键字,然后定义类型,也可以不定义,不定义的话系统会自动推断它的类型,这是和Java变量声明最不同的地方,Java的变量必须声明类型。

3.2 只读变量(常量)

val c: Int = 2

用关键字val来定义一个只读变量,变量一旦初始化之后,不可再次赋值。类似于Java中使用final关键字定义一个常量。

4. 代码注释

和Java是一样的

// 单行注释/*  代码块多行注释 */

5. 使用字符串模板

var a = 1
// 简单模板:
val s1 = "a is $a" a = 2
// 复杂一点的:
val s2 = "${s1.replace("is", "was")}, but now is $a"

使用一个美元符号$+ 变量名,就能引用该变量的值,别忘了外面要加双引号。甚至在引用的时候还能对值进行操作,需要注意,这种操作并不会改变原变量(上面代码里的s1)的值。

6. 使用条件表达式

if语句:

fun maxOf(a: Int, b: Int): Int {if (a > b) {return a} else {return b}
}

一个获取最大值的方法,看起来和Java的写法一样啊,哈哈哈。其实它还能简写:

fun maxOf(a: Int, b: Int) = if (a > b) a else b

一行代码就写好了,这就是传说中的语法糖吧。用熟练了,写起来确实轻松。

7. 使用可空值,进行null检查

  var a: String = "323"var b: String? = "dfd"

使用问号?,表明该变量b为可空,而变量a一定不能为空,如果在使用过程中给变量a赋null值,将会自动报错,所以可以放心地操作a,比如a.length一定不会出现NullPointException。 而如果调用b.length则将会报错,因为变量b有可能为空。如果一定要调用可以使用安全调用符?.代替., 比如b?.length,那么当b为null时,这个方法将返回null,而不是出现NullPointException

关于安全调用符?., 比如我们有一个对象 Person,里面有一个对象参数 school,对象School里有字符串变量 schoolName, 现在我们要知道这个人所在学校的名称。那么使用通常方式是:Person.school.schoolName,但是如果对象personnull或者schoolnull,这种调用将会出现NullPointException,如果使用安全调用符:Person?.school?.schoolName,只要其中某个对象为空,结果将返回null,而不是直接报错。

fun printProduct(arg1: String, arg2: String) {//将字符转换为数字,如果转换失败将返回nullval x = arg1.toIntOrNull()val y = arg2.toIntOrNull()if (x != null && y != null) {//计算x和y的乘积println(x * y)} else {//打印信息,提示某个参数无法转换println("either '$arg1' or '$arg2' is not a number")}
}

上面这种null检查和Java里的写法差不多,进行操作之前先检查是否为null

获取一个字符串的长度,如果为空,返回-1

val l: Int = if (b != null) b.length() else -1

另一种简略写法:有点像Java里面的三目运算,如果不为空,返回b的长度,否则返回-1

val l = b.length()?: -1

8. 类型检查和自动转换

  fun getStringLength(obj: Any): Int?{return if(obj is String) obj.length else null}

使用is操作符判断参数的类型,类似于Java 里面的 instanceof操作符,判断之后,可以直接调用其对应类的方法,相当于做了类型转换。上面的Any类型类似于Java的Object类型,是所有类的父类。

9. 使用for循环

val items = listOf("apple", "banana", "kiwifruit")
for (item in items) {println(item)
}

Java里面使用冒号:作循环操作符, 而Kotlin使用in。另一种Kotlin写法如下:

val items = listOf("apple", "banana", "kiwifruit")
for (index in items.indices) {println("item at $index is ${items[index]}")
}

通过listindex来循环

10. 使用while循环

val items = listOf("apple", "banana", "kiwifruit")
var index = 0
while (index < items.size) {println("item at $index is ${items[index]}")index++
}

和Java一样。。

11. 使用when表达式

fun describe(obj: Any): String =when (obj) {1 -> "One""Hello" -> "Greeting"is Long -> "Long"!is String -> "Not a string"else -> "Unknown"
}

类似于Java中的Switch表达式,但when功能更强大,它能够使用表达式作为分支条件。可以使用when来替代if - else if表达式

12. 使用ranges

val x = 10
val y = 9
if (x in 1..y+1) {println("fits in range")
}

使用关键字in 检查数值是否在某个范围内。

val list = listOf("a", "b", "c")
if (-1 !in 0..list.lastIndex) {println("-1 is out of range")
}
if (list.size !in list.indices) {println("list size is out of valid list indices range too")
}

检查数值是否在某个范围外。

range迭代, 打印 1 到 5

for (x in 1..5) {print(x)
}

13. 使用Collections

集合的遍历上面已经介绍过,这里就不说了。

使用lambda表达式对集合进行过滤和映射等操作

 fun printSpecificFruit(){var fruits = listOf("apple", "orange", "pearl", "pineapple")fruits.filter { it.contains("ap") }.sortedBy { it }.map { it.toUpperCase() }.forEach { println(it) }}

其中的关键字it用来指代集合中的单项。使用filter方法过滤内容,sortedBy方法对集合排序,map方法进行映射,最后打印出来的内容如下:

APPLE
PINEAPPLE

14. 创建类的实例

var rectangle = Rectangle(5.0, 2.0)
var triangle = Triangle(3.0, 4.0, 5.0)

和Java相比,连关键字new都不用了。

第一次接触Kotlin,难免理解有误,请不吝指教。

Kotlin学习之起始篇—基础语法相关推荐

  1. java学习总结——通过题来学习Java(Java基础语法)

    java学习总结--通过题来学习Java(Java基础语法篇之一) 一.概述 大二痛苦的前十个周后,我终于得到了喘息之机,有时间来回顾一下之前所学到的东西,总结一下之前的所得,尝试获取一下新的东西,同 ...

  2. Kotlin学习笔记(3)- 语法

    系列文章全部为本人的学习笔记,若有任何不妥之处,随时欢迎拍砖指正.如果你觉得我的文章对你有用,欢迎关注我,我们一起学习进步!kotlin学习笔记系列首发简书和CSDN Kotlin学习笔记(1)- 环 ...

  3. python导入模块的语法结构_python学习第五讲,python基础语法之函数语法,与Import导入模块....

    python学习第五讲,python基础语法之函数语法,与Import导入模块. 一丶函数简介 函数,就是一个代码块,这个代码块是别人写好的.我们调用就可以. 函数也可以称为方法. 1.函数语法定义 ...

  4. 大数据HiveSQL学习笔记三-查询基础语法以及常用函数

    大数据HiveSQL学习笔记三-查询基础语法以及常用函数 一.基础语法 1.SELECT -列名- FROM -表名- WHERE -筛选条件- 如:需要根据城市,性别找出匹配的10个用户 user_ ...

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

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

  6. 前端学习笔记之CSS3基础语法与盒模型(二)

    前端学习笔记之 CSS3基础语法与盒模型 CSS3简介 CSS(cascading style sheet,层叠式样式表)是用来给HTML标签添加样式的语言 CSS3是CSS的最新版本,增加了大量的样 ...

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

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

  8. 前端学习笔记之1 基础语法及标签

    引言 : 博主目前是一名iOS开发者, 所会的语言有Objective-C 和 Swift, 目前正在学习前端, 增强一下技术能力, 等学会点皮毛之后打算接触一下React Native; 这篇文章只 ...

  9. 【学习笔记】JS基础语法一小时通

    内容整理自<从0到1Javascript快速上手>上半部分-基础语法篇

最新文章

  1. 约瑟夫环c语言计蒜客链表,约瑟夫环的故事 - osc_3n35hvex的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. 面试旧敌之红黑树(直白介绍深入理解)
  3. (转)十步精通新语言
  4. Maven导入或新建项目时更改项目jdk版本
  5. 智能客户端(SmartClient)
  6. 关于oracle监听程序的相关问题及解决方法
  7. VS2013 int main(int argc, char** argv)参数传递
  8. 破解class文件的第一步:深入理解JAVA Class文件
  9. concatenate python_python中numpy.concatenate()函数的使用
  10. MyBatis 批量插入(ExecutorType.BATCH)
  11. struts2(2012/2/24)
  12. Hbase高级功能过滤(Filter)
  13. MySQL · 源码分析 · MySQL 半同步复制数据一致性分析
  14. Spark面试:Spark on yarn 运行流程
  15. [双调]落梅风(寿阳曲).焰火似龙
  16. spark配置lzo
  17. micropython教程nucleo-f767zi开发板_micropython移植到正点原子F767的問題
  18. 2020-05-22
  19. 关于奥威亚自动录播系统的设置使用小笔记
  20. 关于计算机的猜谜游戏,益智猜谜电脑版

热门文章

  1. 【Java】到底什么是包?|最通俗易懂讲解|保姆级
  2. __OPTIMIZE__
  3. 量子计算机能算一加一吗,等量子计算机能算出来1+1=2这个加法,再谈论是否超过传统计算机为好...
  4. 【windows 自带的certutil 完成 md5, sha1 sha256校验】
  5. dwg格式转换pdf,几个很不错的转换方法
  6. 第九课(面向对象):封装 继承 多态
  7. sklearn SVM原理与实现(附代码)
  8. 精美的淘客项目完全开源啦,确定不来围观吗
  9. DAY1-声速、声压与声强
  10. 4月从零学习C语言(第27天)——位运算