Bennyhou的kotlin视频的学习笔记(一)

来源:互联网 发布:js 时间格式转换 编辑:程序博客网 时间:2024/05/17 21:39

先给出视频作者的目录,对视频的思路进行大致了解,然后我会给出自己对学习总结,已便于浏览记忆。

第一部分 语言基础(已完结)

01 Kotlin 简介

  简要介绍下什么是 Kotlin,新语言太多了,大家为什么要接触 Kotlin 呢?因为它除了长得与 Java 不太像以外,其他的都差不多~

02 Hello World

  千里之行,始于Hello World!

03 使用Gradle编写程序简介(可选)

  这年头,写 Java 系的代码,不知道 Gradle 怎么行呢?

04 集合遍历 map

  放下 i++,你不知道 map 已经占领世界了么?以前我以为 map-reduce 很牛逼,后来才知道就是数据迭代处理嘛。

05 集合扁平化 flatMap

  这个可以说是 map 的一个加强版,返回的仍然是开一个可迭代的集合,用哪个您自己看需求~

06 枚举类型与When表达式

  Kotlin 丢掉了 switch,却引进了 when,这二者看上去极其相似,不过后者却要强大得多。至于枚举嘛,还是 Java 枚举的老样子。

07 在 RxJava 中使用 Lambda

  这一期通过一个统计文章中字符数的小程序进一步给大家呈现 Lambda 的威力,也向大家展示一下如何在 Kotlin 当中优雅地使用 RxJava。我不做教科书,所以如果大家对概念感兴趣,可以直接阅读官方 API

  RxJava 是一个非常流行的 Java Reactive 框架,函数式的数据操作使得 Lambda 表达式可以充分体现自己的优势,比起 Java 的冗长,你会看到一段非常漂亮简洁的代码。建议大家先阅读 RxJava 的官方文章以对其有一些基本的认识。

08 使用 Retrofit 发送 GET 请求

  Retrofit 是 Square 的 Jake 大神开源的RESTful 网络请求框架,用它发送请求的感觉会让你感觉爽爆的。我这里还有几篇文章,以及一个我 hack 过的分支 HackRetrofit,有兴趣的童鞋可以一起探讨下~

  • Android 下午茶:Hack Retrofit 之 增强参数.

  • Android 下午茶:Hack Retrofit (2) 之 Mock Server

  • 深入浅出 Retrofit,这么牛逼的框架你们还不来看看?

09 尾递归优化

  尾递归,顾名思义,就是递归中调用自身的部分在函数体的最后一句。我们知道,递归调用对于栈大小的考验是非常大的,也经常会因为这个导致 StackOverflow,所以尾递归优化也是大家比较关注的一个话题。Kotlin 支持语法层面的尾递归优化,这在其他语言里面是不多见的。

10 单例

  单例大家一定都不陌生,只要你动手写一个程序,就免不了要设计出一些全局存在且唯一的对象,他们就适合采用单例模式编写。在 Java 里面,单例模式的写法常见的有好几种,虽然简单却也是涉及了一些有意思的话题,那么在 Kotlin 当中我们要怎么设计单例程序呢?

11 Sealed Class

  枚举类型可以很好的限制一个类型的实例个数,比如 State 枚举有两种类型 IDLE 和 BUSY 两种状态,用枚举来描述再合适不过。不过,如果你想要设计子类个数有限的数据结构,比如指令,指令的类型通常是确定的,不过对于某些有参数的指令每一次都使用同一个实例反而不合适,这时候就需要 Sealed Class。   

12 Json数据引发的血案

  Json 数据可真是大红大紫一番,它实在是太容易理解了,随着 Js 的火爆它就更加『肆无忌惮』起来。我们在 Java/Kotlin 当中解析它的时候经常会用到 Gson 这个库,用它来解析数据究竟会遇到哪些问题?本期主要围绕 Json 解析的几个小例子,给大家展示一下 Java/Kotlin 的伪泛型设计的问题,以及不完整的数据的解析对语言本身特性的冲击。

13 kapt 以及它的小伙伴们

  首先感谢 @CodingPapi,这一期的内容主要来自于他的建议。

  Kotiln 对于注解的支持情况在今年(2016)取得了较大的成果,现在除了对 @Inherited 这个注解的支持还不够之外,试用了一下没有发现太大的问题。关于 kapt,官方的文章罗列下来,其中

  • kapt: Annotation Processing for Kotlin 已经过时了,大家可以阅读下了解其中提到的三个方案

  • Better Annotation Processing: Supporting Stubs in kapt 提到的实现其实基本上就是现在的正式版

  • Kotlin 1.0.4 is here 提到了 kapt 的正式发布,需要注意的是,kapt 的使用方法有些变化,需要 apply plugin: 'kotlin-kapt'

  本期主要通过一个简单的 Dagger2 实例给大家展示了注解在 Kotlin 当中的使用,看上去其实与在 Java 中使用区别不大,生成的源码也暂时是 Java 代码,不过这都不重要了,反正是要编译成 class 文件的。

  后面我们又简单分析了一下 Dagger2 以及 ButterKnife 的源码(有兴趣的话也可以看下我直接对后者进行分析和 Hack 的一篇文章:深入浅出 ButterKnife,听说你还在 findViewById?),其实自己实现一个注解处理器是非常容易的,类似的框架还有androidannotations,它的源码大家可以自行阅读。


通过这个例子,我们其实发现 kapt 还是有一些不完善的地方,主要是:

  1. 不支持 @Inherited
  2. 生成的源码需要手动添加到 SourceSets 中
  3. 编译时有时候需要手动操作一下 gradle 的 build 才能生成源码(这一点大家注意下就行了,我在视频中并没有提到)

不过总体来讲,kapt 的现状还是不错的,相信不久的将来这些问题都将不是问题。


14 Kotlin 与 Java 共存 (1)

  你想要追求代码简洁、美观、精致,你应该倾向于使用 Kotlin,而如果你想要追求代码的功能强大,甚至有些黑科技的感觉,那 Java 还是当仁不让的。

  说了这么多,还是那句话,让他们共存,各取所长。

  那么问题来了,怎么共存呢?虽然一说理论我们都知道,跑在 Jvm 上面的语言最终都是要编成 class 文件的,在这个层面大家都是 Java 虚拟机的字节码,可他们在编译之前毕竟还是有不少差异的,这可如何是好?

  正所谓兵来将挡水来土掩,有多少差异,就要有多少对策,这一期我们先讲在 Java 中调用 Kotlin

15 Kotlin 与 Java 共存 (2)

  上一期我们简单讨论了几个 Java 调用 Kotlin 的场景,这一期我们主要讨论相反的情况:如何在 Kotlin 当中调用 Java 代码。

  除了视频中提到的点之外还有一些细节,比如异常的捕获,集合类型的映射等等,大家自行参考官方文档即可。在了解了这些之后,你就可以放心大胆的在你的项目中慢慢渗透 Kotlin,让你的代码逐渐走向简洁与精致了。

      
1.helloword

funmain(args: Array<outString>) {//1.fun代表方法2.参数:类型3.out类似java中extends4.Array代表数组
println("Hello World!!")
println(Main("c",0))//对象不需要new关键字
}

classMain(valtitle: String, valid: Int) {
//1/定义对象使用class 2.val 声明的是对象的属性
override funtoString(): String {//1.默认已经复写toString,这里进行override
return"$id-$title"//$模版方法
}
}
2.dataclass

funmain(args : Array<outString>){
println("Hello World!!!")
println(Bean(0,"c"))
}

data classBean(valid : Int, valname: String)//data class
3.反射

funmain(args: Array<outString>){
valuser = User(0,"c")
println(user)
println()
HelloKotlin::class.constructors.map(::println)
//1.使用反射,需要引入reflect库2.HelloKotlin::class获得类引用3。::println是是一个函数类型的值,Lamdba表达式

classHelloKotlin{
funhello(){

}
}
4.集合类型的map函数

funmain(args: Array<String>): Unit{//Unit代表返回的为空
args.map(::println)//集合类型的map函数
}

public classConsoleParamInJava {
publicstatic void main(String... args) {
for(String arg : args){
System.out.println(arg);
}
}
}
5集合类型的flatmap

funmain(varargargs: String) {
args.flatMap{//flatmap返回的还是集合类型,和Rxjava中flatMap类似
it.split("_")//it是默认的元素
}.map{
print("$it${it.length}")//$模版表达式
}
}
public classConsoleParamInJava {
publicstatic void main(String... args) {
for(String arg: args){
String[] splits = arg.split("_");
for(String split : splits){
System.out.print(split);
System.out.print(" ");
}
}
}
}
6枚举

enum classLang(valhello: String){//1.定义枚举使用enum class
ENGLISH("Hello"),
CHINESE("你好"),
JAPANESE("こんにちは"),
KOREAN("안녕하새요");

funsayHello(){
println(hello)
}

companion object{//伴生对象,用于定义静态方法,属性
funparse(name: String):Lang{
returnLang.valueOf(name.toUpperCase())
}
}
}

funmain(args: Array<String>) {
if(args.size ==0)return
vallang = Lang.parse(args[0])
println(lang)
lang.sayHello()
lang.sayBye()
}

funLang.sayBye(){//不修改类,对类进行方法对扩展
valbye =when(this){//when判断,比switch强大很多
Lang.ENGLISH -> {
"Bye"
}
Lang.CHINESE ->"再见"
Lang.JAPANESE ->"さようなら"
Lang.KOREAN ->"안녕히가세요"
}
println(bye)
}
7.与Rxjava结合使用

funmain(args: Array<String>) {
valtext = File(ClassLoader.getSystemResource("input").path).readText()//kotlin的readText方法,读取
Observable.from(text.toCharArray().asIterable()).filter{!it.isWhitespace()}.groupBy{it}.subscribe{
//1.toChartArray返回对是CharArray类型,调用asIterable转为集合类型
//2.filter进行过滤
//3.groupBy进行分组
//4.新的变量o
o->o.count().subscribe{
println("${o.key}->$it")
}
}
}
原创粉丝点击