上一章熟悉了kotlin基本的变量和函数声明,并明白了如何调用函数。本章再来看一些其他有用的东西

包括:

  1. kotlin代码组织结构

  2. when语法

  3. 循环迭代语法

  4. try表达式

1. 代码组织结构

和JAVA一样,kotlin也可以使用"包"来组织代码文件,和JAVA的语法一样,使用package定义包,使用import导入包

但是也有许多不同,例如JAVA中通常包名就对应了类文件的存放路径,比如package cn.java.ch1下有一个User类,那么

对应的Java源文件名应该叫User,位于cn/java/ch1这个文件夹下。但是kotlin没有这个要求,文件名你可以随便起。

文件也可以随便放,文件内想定义几个类,或者是没有类,直接定义顶级函数,都随你。基本没有任何限制

同一个包下的定义的函数,属性等可以直接在其他文件中使用,不同包的如果需要引用,则需要使用import语句,语法和JAVA一样

通过一个例子来看一下:

package action.kotlin.ch2

import java.util.*

/**
* Created by user on 2017/10/9.
*/
class Rectangle(val height: Int, val width: Int) {
val isSquare: Boolean
get() = height == width
} fun createRandomRectangle(): Rectangle {
//使用Java的Random类,需要导包
val random = Random()
return Rectangle(random.nextInt(), random.nextInt())
} fun main(args: Array<String>) {
val rectangle = createRandomRectangle()
val square = rectangle.isSquare
println(square)
}

上边的代码中,函数createRandomRectangle使用了Random类,需要导入java.util包

在另外一个包下新建文件,内容如下:

package action.kotlin.ch2.example

import action.kotlin.ch2.Rectangle

/**
* Created by user on 2017/10/9.
*/
fun main(args: Array<String>) {
val rectangle = Rectangle(20, 20)
println(rectangle.isSquare)
}

这个文件和上边的文件不在同一个包,因此用到另一个包中的类时,需要使用import语句进行导入。同样可以导入另一个文件的顶级函数

用法和JAVA基本是一致的。

2. when语法和枚举

首先建个文件,声明一个枚举类型,来说明when语法的使用

enum class Color(val r: Int, val g: Int, val b: Int) {
RED(255, 0, 0), ORANGE(255, 165, 0),
YELLOW(255, 255, 0), GREEN(0, 255, 0), BLUE(0, 0, 255),
INDIGO(75, 0, 130), VIOLET(238, 130, 238);
//fun rgb() = (r * 256 + g) * 256 + b
} fun getMnemonic(color: Color) =
when (color) {
Color.RED -> "Richard"
Color.ORANGE -> "Of"
Color.YELLOW -> "York"
Color.GREEN -> "Gave"
Color.BLUE -> "Battle"
Color.INDIGO -> "In"
Color.VIOLET -> "Vain"
} fun main(args: Array<String>) {
val color = getMnemonic(Color.BLUE)
println(color)
}

enum是关键字,声明枚举类型使用的。类名后边的括号中是构造参数,先明白那个是构造就够了,后续的文章中关于类的学习部分会详细说的

这里的意思就是声明了一些枚举值,并使用构造函数中的参数来赋值枚举项

getMnemonic函数,需要一个Color类型的枚举值,根据枚举值不同返回不同的字符串给调用方

main函数调用getMnemonic函数,传递Color.BLUE,函数会返回对应的Battle,这里主要看when的语法结构

when后的括号中是你要判断的参数,when的大括号体内就是一个个的分支判断了。所以不用when,我们也可以使用if判断来代替。

至于箭头语法,相信用过JDK8的应该不陌生,就是所谓的lambada表达式了。整个语法和JAVA中的switch case很像,但是明显的区别就是when语法不需要break

如果现在我想让参数为Color.BLUE和或者Color.GREEN时,返回一样的字符串,该如何做?很简单

Color.GREEN, Color.BLUE -> "Gave"
改成这样即可,多个判断分支使用逗号隔开,就是这么简单

去掉枚举的类名前缀,直接使用枚举常量:

如果不想带Color前缀,也简单,首先导入枚举类。导入语句如下:

import action.kotlin.ch2.enumtest.Color.*

然后when的判断中直接写:

GREEN, BLUE -> "Gave"

无需再带Color前缀了。

关于when的分支判断,还有一些组合使用方式,这里不多说了,以后用到会介绍

3. 迭代循环:

kotlin支持while和do while循环,这两种形式的循环迭代和JAVA中的写法没有区别,参考JAVA的即可

3.1 范围操作符

kotlin中有一个名为范围操作符的东西。写作:.. 两个点,例如我想声明一个变量,这个变量包含数字1到10,可以如下声明:

val oneToTen = 1 .. 10

接着可以使用for,while等循环语句来迭代访问,以for循环为例:

for(i in oneToTen) println(i)

上边for循环就是kotlin中for循环的语法,使用 for(var in collections)的语法来进行for迭代

3.2 downTo语法:

kotlin提供了downTo关键字用来反向迭代,例子:

for(i in 100 downTo 1 step 1) print("$i ")

反向迭代一百次,每次输出迭代的值,downTo指定从100迭代到的下限值,step指定了迭代的步阶

4. kotlin中的异常:

4.1 抛出异常:

fun main(args: Array<String>) {
test(500)
}
fun test(percentage: Int) {
if (percentage !in 0..100) {
throw IllegalArgumentException(
"A percentage value must be between 0 and 100: $percentage")
}
}

上述代码的test函数检测参数是否在0-100之间,如果不是抛出异常,可以直接使用java中的异常类。语言和java也没什么不同

4.2 try catch finally

fun main(args: Array<String>) {
val res = caculate(7, 0)
println(res)
}
fun caculate(one: Int, two: Int): Int {
var result: Int = 0
try {
result = one / two
} catch (e: ArithmeticException) {
println("Can't be divided by Zero. $e")
}finally {
//do something
}
return result
}

这个例子函数计算两个数相除,除0引发异常,捕获并作相应处理,和JAVA中也并没有什么不同,唯一的区别就是e: Exception

这里遵循kotlin声明变量的语法:变量名: 类型

kotlin学习三:初步认识kotlin(第二篇)的更多相关文章

  1. 初步了解JVM第二篇

    在一篇<初步了解JVM第一篇>中,我们已经了解了: 类加载器:负责加载*.class文件,将字节码内容加载到内存中.其中类加载器的类型有如下: 启动类加载器(Bootstrap) 扩展类加 ...

  2. Django(三)框架之第二篇

    https://www.cnblogs.com/haiyan123/p/7717788.html 一.知识点回顾 1.MTV模型 model:模型,和数据库相关的 template:模板,存放html ...

  3. angularjs学习第三天笔记(过滤器第二篇---filter过滤器及其自定义过滤器)

    您好,我是一名后端开发工程师,由于工作需要,现在系统的从0开始学习前端js框架之angular,每天把学习的一些心得分享出来,如果有什么说的不对的地方,请多多指正,多多包涵我这个前端菜鸟,欢迎大家的点 ...

  4. Kotlin学习第一课:从对比Java开始

    1. 介绍 今年初,甲骨文再次对谷歌所谓的安卓侵权使用Java提起诉讼,要求后者赔偿高达90亿美元.随后便传出谷歌因此计划将主力语言切换到苹果主导的Swift,不过这事后来没了跟进. 但谷歌在这两天的 ...

  5. 浅谈Kotlin(三):类

    浅谈Kotlin(一):简介及Android Studio中配置 浅谈Kotlin(二):基本类型.基本语法.代码风格 浅谈Kotlin(三):类 浅谈Kotlin(四):控制流 前言: 已经学习了前 ...

  6. kotlin学习笔记-异常好玩的list集合总结

    不积跬步无以至千里,不积小流无以成江海 先看看Kotlin中for循环的遍历 fun testList(){ var StringVal = "12_12_13_15_a_b_c_d_yu_ ...

  7. 000 初步使用Kotlin开发Android应用

    Kotlin是Jetbrians公司开发的一款编程语言,基于jvm兼容Java. 要求 IDE:IDEA或者Android Studio(简称studio)对Kotlin语言有所了解,官方文档:htt ...

  8. RabbitMQ学习总结 第二篇:快速入门HelloWorld

    目录 RabbitMQ学习总结 第一篇:理论篇 RabbitMQ学习总结 第二篇:快速入门HelloWorld RabbitMQ学习总结 第三篇:工作队列Work Queue RabbitMQ学习总结 ...

  9. 学习KnockOut第二篇之Counter

                                                                        学习KnockOut第二篇之Counter        欲看此 ...

随机推荐

  1. APUE学习笔记——11 线程基础

    线程标识 线程由线程号进行标识.线程号仅在线程所属的进程环境中有效.也就是说属于不同进程的两个线程可能线程号一样. 线程标识用结构体pthread_t tid表示.与线程Id相关的函数如下: 比较两个 ...

  2. Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session框架

    Tornado 自定义session,与一致性哈希 ,基于redis 构建分布式 session import tornado.ioloop import tornado.web from myhas ...

  3. 深度学习(六十九)darknet 实现实验 Compressing Deep Neural Networks with Pruning, Trained Quantization and Huffma

    本文主要实验文献文献<Deep Compression: Compressing Deep Neural Networks with Pruning, Trained Quantization ...

  4. DevOps实践

    云计算 [ 01 ]GitLab+Rancher实践DevOps[转载] [ 02 ]Kubernetes CentOS 7.4搭建Kubernetes 1.8.5集群 kubeadm搭建kubern ...

  5. 基本SQL命令

    1.SQL命令的使用规则 1.每条命令必须以 ; 结尾 2.SQL命令不区分字母大小写 3.使用 \c 来终止当前命令的执行 2.库的管理 1.库的基本操作 1.查看已有库 show database ...

  6. Java项目中使用Log4J

    Log4J下载 官网:http://logging.apache.org/log4j/ Log4J 1.2下载地址:http://logging.apache.org/log4j/1.2/downlo ...

  7. Makefile总结

    1.Makefile由目标(Target).依赖关系(Dependency).命令(Command)组成. (1)目标:可定义多个目标,默认指定第一个,make时可指定其中一个. (2)依赖关系:在同 ...

  8. JVM原理二----JAVA虚拟机体系结构

    组成: 指令集,寄存器,栈,无用单元收集(GC),方法区域.JAVA核心 1,指令集:这个不太清楚 2,寄存器:和处理器中的寄存器类似 pc:Java程序计数器. optop:指向*作数栈顶端的指针. ...

  9. install build essential

    CentOS: sudo yum groupinstall 'Development Tools' Ubuntu: sudo apt-get install build-essential

  10. UML基本架构建模--类的术语和概念

     Terms and Concepts 术语和概念   A classis a description of a set of objects that share the same attrib ...