Android Kotlin学习笔记(一)—— Kotlin Koans

题记

正所谓纸上觉来终觉浅,绝知此事要躬行。Kotlin陆陆续续都有在看,但是无奈看了忘,忘了看,痛定思痛,决定重新系统化的整理下学习过程。
我是用Android Studio进行Android开发,配置起来很简单,关于环境问题请自行百度。

1.资料阅读

菜鸟教程:一个很方便的学习网站,支持在线译。
Kotlin学习中文网 :如其名,大部分的资料都可以在上面找到。(强烈推荐)

2.辅助插件

进入正题,强烈推荐一款插件Educate Tools。File-Setting-Plugs 直接搜索就好。这个插件主要有一波练习题已经答案对比,顺着敲一遍,估计对基础语法就掌握七七八八了。
在这里插入图片描述
安装过后直接开启教程,File->Learn and Teach->Browse Courses,顺着说明一步步安装就好。我们选择第一个课程开始操练。
在这里插入图片描述
当然如果嫌插件麻烦,也可以选择在线网页版本。Kotlin Koans在线学习网站

3.习题演练

言归正传,终究不能不能偏离主题,我们是来看练习题的,首先看下课程结构以及使用。
在这里插入图片描述
在1处选择课程模式阅览,总共6个部分,42道习题。还有描述区域进行习题指引,点击右下角的check按钮可以检查习题是否正确。

3.1 Introduction

1.Hello world

简单的打印语句。 fun start(): String = "OK"

2.Java to Kotlin conversion

考查在IDE中Java转Kotlin。把JavaCode.class中的toJSON方法粘贴到Task.kt即可。

3.Named arguments

考察命名参数,例子为Collection的joinToString方法,仔细观看右边说明,注意三个参数均可缺省,但是一定要命名入参的类型。第一个参数为分隔符,第二个参数前缀,第三个参数后缀。

fun joinOptions(options: Collection<String>) = options.joinToString(prefix = "[", postfix = "]")
4.Default arguments

考查Java方法中重载在Kotlin中写法。所有这些Java重载都可以用Kotlin中的一个函数来替换。以使使用foo编译代码的方式更改函数foo的声明。Kotlin中制定的默认参数,可在方法调用中缺省使用默认值,这样就减少了重载的代码行数。
观察右边提示,发现number跟toUpperCase均有默认值,补全方法。

fun foo(name: String, number: Int=42, toUpperCase: Boolean=false) =
        (if (toUpperCase) name.toUpperCase() else name) + number
5.Lambdas

顾名思义,考查Lambda表达式的使用。习题中考察了collection的any()方法使用,入参为一个Lambda表达式,跳到这个方法的界面,可以看到详细的用法,不在赘述。
目标是查看Collection中是否有偶数,如果是,返回true。

fun containsEven(collection: Collection<Int>): Boolean = collection.any {it % 2 == 0}
6.Strings

考查字符串模板。
Kotlin中不需要用反斜杠转义反斜杠,使用$表示一个变量名或者变量值,可以用双引号和三引号包裹内容,内容支持正则表达式。详细的语法可以看上面链接内容。
题目要求匹配格式为13.06.1992的日期(d2=2位数字、一个点、d2=2位数字、一个点、d4=4位数字):

fun getPattern()=“”“\d 2 \.\d 2 \.\d 4”“”

重写此模式,月份作为变量,使其与13 JUN 1992格式的日期匹配(两位数字、一个空白、一个月缩写、一个空白、四位数字)。很简单,点变空格,中间部分用**$**匹配月份。

fun getPattern(): String = """\d{2} ${month} \d{4}"""
7.DateClass

Java中的实体类对应Kotlin中的Data class。定义类时必须标明为data,IDE会自动生成主构造函数中定义的属性,减少了set与get的麻烦。
注意构造函数的写法。根据下面内容提示,补全俩个属性name与age,但是发现与普通类不同的是,属性必须加修饰词,否则提醒报错。

data class Person(val name: String, val age:Int)
8.Nullable types

考查NULL检查机制
Kotlin的空安全设计对于声明可为空的参数,在使用时要进行空判断处理,有两种处理方式:

  1. 字段后加!!表示抛出空异常
  2. 加?表示返回值为 null时不做处理或配合?:做空判断处理
    三个入参client message mailer均有?,均有为空情况。所以在引用的时候也需要?处理。
fun sendMessageToClient( client: Client?, message: String?, mailer: Mailer) {
  val email = client?.personalInfo?.email
    if (message != null && email != null) mailer.sendMessage(email, message)
}
9.Smart casts

题目目的是使用Kotlin的Smart Cast+When实现eval()方法。首先补充感念,在Kotlin中,编译器大部分会自动is检查变量类型检,减少了Java中的强转。这一题就是is+when组合使用。

fun eval(expr: Expr): Int =
        when (expr) {
            is Num -> expr.value
            is Sum -> eval(expr.left) + eval(expr.right)
            else -> throw IllegalArgumentException("Unknown expression")
        }
10.Smart casts

扩展函数:不修改一个类的源码的情况下,扩展一个已经存在的类,为它添加额外的方法。并且同时可以使用this以及所有被扩展类的公有方法。
任务要求为Int和Pair<Int, Int>分别实现一个扩展函数r()。r()函数的功能就是创建一个有理数。

//这里的this代表被扩展的Int
fun Int.r(): RationalNumber = RationalNumber(this, 1)
//这里其实为(this.first,this.second) this省略
fun Pair<Int, Int>.r(): RationalNumber = RationalNumber(first, second)

猜你喜欢

转载自blog.csdn.net/ma598214297/article/details/99703909