为了账号安全,请及时绑定邮箱和手机立即绑定

Kotlin 语言极简教程 v0.1

标签:
Kotlin

Kotlin 语言极简教程

v0.1 (东海陈光剑)

简介

是什么

  • 基于 JVM 实现的静态语言

  • JetBrains 出品。对,就是那个创造了 Android Studio 和 IntelliJ 的公司。

  • Hello World

fun main(args: Array<String>){
    println("Hello World!")
}

极简版:

fun main(args: Array<String>) = println("Hello World!")

特性

  • 简约:帮你减少实现同一个功能的代码量。

  • 易懂:让你的代码更容易阅读,同时易于理解。

  • 安全:移除了你可能会犯错误的功能。

  • 通用:基于 JVM 和 Javascript,你可以在很多地方运行。

  • 互操作性:这就意味着 Kotlin 和 Java 可以相互调用,同时 Jetbrains 的目标是让他们 100% 兼容。

历史

  • Java 有哪些问题?

    • 空引用(Null references):连空引用的发明者Tony Hoare 都承认这是个 billion-dollar 错误。不论你费多大的功夫,你都无法避免它。因为 Java 的类型系统就是不安全的。

Speaking at a software conference called QCon London in 2009, he apologised for inventing the null reference:
I call it my billion-dollar mistake. It was the invention of the null reference in 1965. At that time, I was designing the first comprehensive type system for references in an object oriented language (ALGOL W). My goal was to ensure that all use of references should be absolutely safe, with checking performed automatically by the compiler. But I couldn't resist the temptation to put in a null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years.

  • 原始类型(Raw types):我们在开发的时候总是会为了保持兼容性而卡在范型原始类型的问题上,我们都知道要努力避免 raw type 的警告,但是它们毕竟是在语言层面上的存在,这必定会造成误解和不安全因素。

  • 协变数组(Covariant arrays):你可以创建一个 string 类型的数组和一个 object 型的数组,然后把 string 数组分配给 object 数组。这样的代码可以通过编译,但是一旦你尝试在运行时分配一个数给那个数组的时候,他就会在运行时抛出异常。

  • Java 8 存在高阶方法( higher-order functions ),但是他们是通过 SAM 类型 实现的。SAM 是一个单个抽象方法,每个函数类型都需要一个对应的接口。如果你想要创建一个并不存在的 lambda 的时候或者不存着对应的函数类型的时候,你要自己去创建函数类型作为接口。

  • 泛型中的通配符:诡异的泛型总是难以操作,难以阅读,书写,以及理解。对编译器而言,异常检查也变得很困难。

  • Kotlin 新的特性

    • elvis操作符

    • Java

    • Java
      var length = if(a!= null) a.length() else -1

    • Kotlin
      var length = a?.length() ?: -1

    • val a = 1

    • Lambda 表达式

    • 类型推导

    • 数据类 (Data classes)

    • 函数字面量和内联函数(Function literals & inline functions)

    • 函数扩展 (Extension functions)

    • 空安全(Null safety)

String a  = null;
System.out.println(a.length());

在 Java 里,声明一个 string 类型,赋一个 null 给这个变量。一旦我们要打印这个字符串的时候,会在运行时曝出空指针错误,因为我们在尝试去读一个空值。
* kotlin 写法
* 我们定义一个空值,但是在我们尝试操作它之前,Kotlin 的编译器就告诉了我们问题所在:

val a:String = null

曝出的错误是:我们在尝试着给一个非空类型分配一个 null。在 Kotlin 的类型体系里,有空类型和非空类型。类型系统识别出了 string 是一个非空类型,并且阻止编译器让它以空的状态存在。想要让一个变量为空,我们需要在声明后面加一个 ? 号,同时赋值为 null。

val a: String? = nullprintln(a.length())

现在,我们修复了这个问题,继续向下:就像在 Java 里一样,我们尝试打印 stirng 的长度,但是我们遇到了跟 Java 一样的问题,这个字符串有可能为空,不过幸好的是:Kotlin 编译器帮助我们发现了这个问题,而不像 Java 那样,在运行时爆出这个错误。

编译器在长度输出的代码前停止了。想要让编译器编译下去,我们得在调用 length 方法的时候考虑到可能为空的情况,要么赋值给这个 string,要么用一个问号在变量名后,这样,代码执行时在读取变量的时候检查它是否为空。

val a: String? = nullprintln(a?.length())

如果值是空,则会返回空。如果不是空值,就返回真实的值。print 遇到 null 会输出空。

* 智能转换(Smart casts)
* 字符串模板(String templates)
* 主构造函数(Primary constructors)
* 类委托(Class delegation)
* 类型推断(Type inference)
* 单例(Singletons)
* 声明点变量(Declaration-site variance)
* 区间表达式(Range expressions)

现状&未来发展

基本类型

分支循环

if

fun main(args: Array<String>) {
    val name = if (args.isNotEmpty()) {
        args[0]
    } else {        "World"
    }
    println("Hello, $name!")
}

val name = if (args.isNotEmpty()) args[0] else "Word"

for

enum class Language(val greeting: String) {
    EN("Hello"), ES("Hola"), FR("Bonjour")
}class Person(var name: String, var lang: Language = Language.EN) {    fun greet() = println("${lang.greeting}, $name!")
}fun main(args: Array<String>) {
    val people = listOf(
       Person("Java"),
       Person("Miguel", Language.SP),
       Person("Michelle", Language.FR)
    )    for (person in people) {
        person.greet()
    }
}



作者:东海陈光剑
链接:https://www.jianshu.com/p/afdbe8d5ba67


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消