转自:Koltin China (一) 介绍 #Kotlin-for-Android-Dev

1. 什么是Kotlin?

Kotlin是JetBrains开发的基于JVM的语言。Kotlin是使用Java开发者的思维被创建的,Intellij作为它主要的开发IDE。对于Android开发者,有两个有趣的特点:

  • 对Java开发者来说,Kotlin是非常直觉化的,并且非常容易学习。语言的大部分内容都是与我们知道的非常相似,不同的地方,它的基础概念也能迅速地掌握它。
  • 它与我们日常生活使用的IDE无需配置就能完全整合。Android Studio能够非常完美地理解、编译运行Kotlin代码。而且对这门语言的支持来正是自于开发了这个IDE的公司本身,所以我们Android开发者是一等公民。

但是这仅仅是开发语言和开发工具之间的整合。相比Java 7的优势到底是什么呢?

  • 它更加易表现:这是它最重要的优点之一。你可以编写少得多的代码。
  • 它更加安全:Kotlin是空安全的,也就是说在我们编译时期就处理了各种null的情况,避免了执行时异常。如果一个对象可以是null,则我们需要明确地指定它,然后在使用它之前检查它是否是null。你可以节约很多调试空指针异常的时间,解决掉null引发的bug。
  • 它是函数式的:Kotlin是基于面向对象的语言。但是就如其他很多现代的语言那样,它使用了很多函数式编程的概念,比如,使用lambda表达式来更方便地解决问题。其中一个很棒的特性就是Collections的处理方式。
  • 它可以扩展函数:这意味着我们可以扩展类的更多的特性,甚至我们没有权限去访问这个类中的代码。
  • 它是高度互操作性的:你可以继续使用所有的你用Java写的代码和库,因为两个语言之间的互操作性是完美的。甚至可以在一个项目中使用Kotlin和Java两种语言混合编程。

2. 我们通过Kotlin得到什么

易表现

通过Kotlin,可以更容易地避免模版代码因为大部分的典型情况都在语言中默认覆盖实现了。举个例子,在Java中,如果我们要典型的数据类,我们需要去编写(至少生成)这些代码:

public class Artist {
private long id;
private String name;
private String url;
private String mbid; public long getId() {
return id;
} public void setId(long id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getUrl() {
return url;
} public void setUrl(String url) {
this.url = url;
} public String getMbid() {
return mbid;
} public void setMbid(String mbid) {
this.mbid = mbid;
} @Override public String toString() {
return "Artist{" +
"id=" + id +
", name='" + name + '\'' +
", url='" + url + '\'' +
", mbid='" + mbid + '\'' +
'}';
}
}

使用Kotlin,我们只需要通过数据类:

data class Artist(
var id: Long,
var name: String,
var url: String,
var mbid: String)

这个数据类,它会自动生成所有属性和它们的访问器,以及一些有用的方法,比如,toString()

空安全

当我们使用Java开发的时候,我们的代码大多是防御性的。如果我们不想遇到NullPointerException,我们就需要在使用它之前不停地去判断它是否为null。Kotlin,如很多现代的语言,是空安全的,因为我们需要通过一个安全调用操作符(写做?)来明确地指定一个对象是否能为空。

我们可以像这样去写:

// 这里不能通过编译. Artist 不能是null
var notNullArtist: Artist = null // Artist 可以是 null
var artist: Artist? = null // 无法编译, artist可能是null,我们需要进行处理
artist.print() // 只要在artist != null时才会打印
artist?.print() // 智能转换. 如果我们在之前进行了空检查,则不需要使用安全调用操作符调用
if (artist != null) {
artist.print()
} // 只有在确保artist不是null的情况下才能这么调用,否则它会抛出异常
artist!!.print() // 使用Elvis操作符来给定一个在是null的情况下的替代值
val name = artist?.name ?: "empty"

扩展方法

我们可以给任何类添加函数。它比那些我们项目中典型的工具类更加具有可读性。举个例子,我们可以给fragment增加一个显示toast的函数:

fun Fragment.toast(message: CharSequence, duration: Int = Toast.LENGTH_SHORT) {
Toast.makeText(getActivity(), message, duration).show()
}

我们现在可以这么做:

fragment.toast("Hello world!")

函数式支持(Lambdas)

每次我们去声明一个点击所触发的事件,可以只需要定义我们需要做些什么,而不是不得不去实现一个内部类?我们确实可以这么做,这个(或者其它更多我们感兴趣的事件)我们需要感谢lambda:

view.setOnClickListener { toast("Hello world!") }

koltin语言学习(一)——什么是koltin的更多相关文章

  1. C语言学习 第八次作业总结

    本次作业其实没有新的内容,主要就是复习上一次的一维数组的相关内容.冯老师布置了5道题目,其中涉及到一些比较简单的排序或者是查找的方法.因为数据很少,所以直接使用for循环遍历就可以了. 关于本次作业, ...

  2. C语言学习 第七次作业总结

    C语言学习 第七次作业总结 数组可以分为数组和多下标数组(在传统的国内C语言书本中,将其称为二/多维数组). 数组名称 在之前的课程中,大家应该都有印象,对于int a这样的定义,会为变量 a 声明一 ...

  3. 技能收获与C语言学习

    你有什么技能比大多人(超过90%以上)更好? 我会的东西很多,喜欢的东西太多,但是很遗憾广而不专,会而不精.学了很多东西我都是为了娱乐,因为以前我们那里过于强调学习,很多爱好也都被扼杀在摇篮里.我觉得 ...

  4. 一份关于Swift语言学习资源的整理文件

    一份关于Swift语言学习资源的整理文件     周银辉 在这里下载 https://github.com/ipader/SwiftGuide

  5. go语言学习笔记

    Go语言学习基本类型Bool 取值范围:true,false (不可以用数字代替)Int/uint 根据平台可能为32或64位int8/uint8 长度:1字节 取值范围-128~127/0~255b ...

  6. 20155206赵飞技能获取经验,C语言学习感想与对JAVA的学习目标

    自己较强的技能获取经验. 1:实话实说我自己是没有哪个技能可以超过90%的人的,只有自认为做的还可以的一些事情,例如打篮球,office软件的应用,一百米跑.至于其他方面就是很平庸了. 2:经验主要有 ...

  7. HTML语言学习笔记(会更新)

    # HTML语言学习笔记(会更新) 一个html文件是由一系列的元素和标签组成的. 标签: 1.<html></html> 表示该文件为超文本标记语言(HTML)编写的.成对出 ...

  8. 20155229-付钰涵-分析自我技能延展到c语言学习状况

    我的小技能 我记得幼儿园时表演的舞蹈,也记得从水彩到素描的学习,还记得小学和初中获得的钢琴省级奖项. 舞蹈止于一年级,绘画止于三年级,钢琴从学前班到高一那十年的时间里有过断续. 03年-04年的那个冬 ...

  9. linux 下C语言学习路线

    UNIX/Linux下C语言的学习路线.一.工具篇“公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习C语言编程常常用到的软件和工 ...

随机推荐

  1. Java第02次实验提纲(Java基本语法与类库)

    1. 熟悉Git 1.1 学会使用网页版的操作代码仓库(gitee) 申请账号,然后根据老师提供的链接或者二维码加入团队,然后修改昵称. fork老师提供的代码库项目,新建自己学号命名的文件并上传一些 ...

  2. 【idea】之取消@param注释参数错误提示

    改为

  3. CodeLite C/C+ IDE更新放出

    CodeLite IDE Revision 1145 for C/C++已经发布,这是一个强大的开源,跨平台的C/C++整合开发环境.目前已经在Windows XP SP3,Ubuntu 7.10 G ...

  4. P1706 全排列问题

    题解:(其实我认为它就是个循环) #include<iostream> #include<cstdio> #include<iomanip> using names ...

  5. Java学习——Applet写字符串(调字体)

    import java.awt.*; import java.applet.Applet; public class GUI2 extends Applet{ public void paint(Gr ...

  6. svn 的add 和 commit

    add 功能:向文件拷贝所在的文件夹中添加新的文件,并作出标识,是新添加的,下一步提交时将一并提交到Subversion版本库中去.简单的说就是将一新文件加入svn,你添加再提交后该文件就进入subv ...

  7. Mongodb集群搭建之 Replica Set

    Mongodb集群搭建之 Replica Set Replica Set 中文翻译叫做副本集,不过我并不喜欢把英文翻译成中文,总是感觉怪怪的.其实简单来说就是集群当中包含了多份数据,保证主节点挂掉了, ...

  8. solr7.1.0学习笔记(10)---Solr发布到Tomcat

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/weixin_39082031/article/details/79069554 将solr作为一个单 ...

  9. 查看linux的IO占用

    iotop -oPiostat -xm 1 iostat -d -x -kiostat -c top

  10. linux学习思维导图(转)

    转自:https://blog.csdn.net/m1585761297/article/details/80017111 先附上一张学习路径的导图 导图一 导图二(一套) 1.Linux目录结构 2 ...