Kotlin 作为 Android 开发语言相比传统 Java 有什么优势?
Kotlin 作为 Android 开发语言相比传统 Java 有什么优势?
https://www.zhihu.com/question/37288009
37 个回答
Kotlin 语言相对 Java 有很多优势,比如官网介绍的简洁、安全,例子见 Kotlin 中文站 首页,部分示例解析见下文。Kotlin 具有现代(也有称下一代的)静态编程语言的很多特点,如类型推断、多范式支持、可空性表达、扩展函数、DSL 支持等。另外对于安卓开发还提供了 Kotlin 安卓扩展和 Anko 库,参见 Kotlin 用于 Android 。
关于与 Java 互操作,尤其是 Java 调用 Kotlin 是大家普遍觉得坑的地方,除了默认 final 外,还有一个主要原因应该就是名字修饰,解决方式可以按照它修饰后名字去引用,或者在 Kotlin 端使用 @JvmName 注解来生成便于 Java 使用的名字。具体参见 Java 中调用 Kotlin 。
让我们看下官方给出的一些例子:
简洁性
使用一行代码创建一个包含 getters、 setters、 equals()、 hashCode()、 toString() 以及 copy() 的 POJO:
data class Customer(val name: String, val email: String, val company: String)
这个对于 Java 恐怕要写半屏到一屏代码,如果用 Lombok 能好一些,但也不及 Kotlin 简洁。了解更多请参见数据类。
或者使用 lambda 表达式来过滤列表:
val positiveNumbers = list.filter { it > 0 }
注意到了吗?它用 it 来简化单参数的 Lambda 表达式,了解更多请参见 Lambda 表达式。
想要单例?创建一个 object 就可以了:
object ThisIsASingleton {
val companyName: String = "JetBrains"
}
简洁之至,无需赘述。了解更多请参见对象。
安全性 ——可空性表达 与 类型判断
彻底告别那些烦人的 NullPointerException,毕竟价值万亿。
var output: String
output = null // 编译错误
无特殊标志的变量默认不可空。
Kotlin 可以保护你避免对可空类型的误操作
val name: String? = null // 可空类型
println(name.length()) // 编译错误
可空变量的类型需要后缀“?”,对于可空变量在未判断其可空性时不可直接调用其方法或访问其属性。了解更多请参见空安全。 另外这里用 val 声明的变量是不可变的,对于不可变变量有很多好处,比如并发安全、适合函数式编程等等。参见基础语法。
并且如果你检查类型是正确的,编译器会为你做自动类型转换
fun calculateTotal(obj: Any) {
if (obj is Invoice)
obj.calculateTotal()
}
类型在判断后自动转换为相应对象;另外,对于可空变量,做非空性判断的相应分支也能自动转成非空值。
DSL
让我们看一个复杂一点的例子,构造 HTML 的 DSL 代码:
val data = mapOf(1 to "one", 2 to "two")
createHTML().table {
for ((num, string) in data) { // 遍历数据
tr { // 创建 HTML 标签的函数
td { +"$num" }
td { +string } // 输出变量的值
}
}
}
这个例子比较复杂,建议对 Kotlin 熟悉一定程度再来看。 最上方声明了一个不可变的 data 作为创建 HTML 用的数据,它是一个由 mapOf 函数创建的映射(map),其中用扩展函数 to 的中缀调用形式来创建键值对。接下来的 table 是一个方法(或扩展函数), 它接受一个 Lambda 表达式,对于这种情况的函数调用可省略括号。之后 for 循环中的 tr 和 td 与 table 类似, 只是它们有隐式接收者。 此外 for 循环的条件用到了解构声明, 两个 td 传入的 Lambda 表达式都用到了操作符重载, 对于第一个还用到了字符串模版。
本文原是我在知乎上的回答,经整理并补充示例解析而来(然后又更新到回答答案中),另外也发布在我的博客上:Kotlin 概览--如何看待 Google 将 Kotlin 选为 Android 官方语言?
我是 Kotlin 中文站维护人,中文站就是 Kotlin 官方英文站的中文翻译,目前已经完成参考文档的翻译:参考 - Kotlin 语言中文站 。这应该也是目前唯一一份最新且完整的官方参考文档中文翻译。欢迎大家反馈问题及一同翻译。
另外欢迎关注 Kotlin中文博客 并积极投稿。
如果好玩的也可以投稿给千里冰封被吊打的日常 - 知乎专栏。
首先很高兴看到Google在I/O上官网宣布 Kotlin 成为 Android 的语言。我觉得既是大势所趋,也使得Android编程上效率大增。自从写了一段时间 Python 和 Swift 语言之后,我就觉得 Java 这样“冗长”的语言应该慢慢退出历史舞台了(本来2-3行python的逻辑,Java可以写出20+行);而 Java 之前由于其写代码“爽”和“多”成为很多程序员喜欢的点,但是历史的巨轮滚滚向前,终究我们编码会是越来越简洁,工作量越来越少。
回到问题本身,个人觉得 Kotlin 比 Java 优秀在于:
由 JetBrain 的牛人 Dmitry Jemerov 在2011年开始带队开发,主要是解决Java之前被诟病已久的问题,而且积极借鉴了 Scala、Ruby 等新语言在开发效率和简洁性上的优势。由于是全新开发和设计的语言,当然在各方面上都有着其先进性,也就是重新设计的 Java现代版;比起 Scala 更加interoperate with Java,比如说很多 Kotlin 的库都可以一直复用 Java libraries。
想必大部分程序员应该都写过Java,有些甚至写过10年以上;Java的好处是语法工整,清晰直接,严格,不容易犯低级程序错误;但是它的问题也很明显:“verbosity”,中文通俗翻译就是 “王大妈的裹脚又臭又长”。经常是 Python 或者 Ruby 10行完成的逻辑或者data class,用 Java 可以轻松轻松写出三倍多的代码。大部分程序员对此表示很无语,小数程序员可能还会陷入一种自我催眠状态,觉得自己程序码的多,于是码的爽,于是沾沾自喜于每天可以写500或者上千行代码的自我感动中。而 Kotlin 和 iOS 上 swift 的出现,可以有效地节约我们程序员不少的时间,让写代码更为有效率。
另外 Java 还有最大的一个问题,在Null的处理上一直是其阿基里斯之踵:Top 5 Crashes on Android - Apteligent
在 Android top crashes 的排名上:第一 NPE(NullPointerException),第二 OOM(OutOfMemoryException,特别对于低端手机而言);Java 最近的改进也是在 annotation 上增加对于 null 的规范和检查。而 Kotlin 则是彻底规范了对于变量在 null 上检查和支持 "?:" 来简洁地处理 null。比如:
if (nullable != null) nullable.doStuff() // Java
nullable?.doStuff() // Kotlin
// Java
public void sendMessageToClient(
@Nullable Client client,
@Nullable String message,
@NotNull Mailer mailer
) {
if (client == null || message == null) return;
PersonalInfo personalInfo = client.getPersonalInfo();
if (personalInfo == null) return;
String email = personalInfo.getEmail();
if (email == null) return;
mailer.sendMessage(email, message);
}
// Kotlin
fun sendMessageToClient(
client: Client?, message: String?, mailer: Mailer
) {
if (client == null || message == null) return
var personalInfo = client.personalInfo ?: return
var email = personalInfo.email ?: return
mailer.sendMessage(email, message)
}
从上面可以看到在检查和处理 nullable 变量的时候,Kotlin 更加有效。
另外 Kotlin 先进的地方还有 Lamda、Extension function、when 等;都是现在语言默认支持的特性。这里就不一一介绍了。
其实之前我最为担心的问题是:Kotlin 会不会像 Scala 或者 Groovy 或者 Clojure 那样,“先进”但是曲高和寡,最后导致没人用。经过这次的 Google IO 的官方支持,我现在200%确定 Kotlin 会是以后 Android 上主流语言的方向,所以各位现在就开始学习吧。
附带我觉得最为有效的Kotlin学习方法:
1. 先快速浏览:Basic Syntax - Kotlin Programming Language
2. 对于Java选手,附加看这个:From Java to Kotlin
3. 上手跟着这个tutorial一步一步完成它的练习:Try Kotlin
4. 把 Cheatsheet 打出来贴在显示器旁边没事看看:https://pbs.twimg.com/media/C0yRbHLUUAAgacl.jpg
5. 文字版本 Cheatsheet: https://gist.github.com/dodyg/5823184 https://gist.github.com/dodyg/5616605
什么底层实现对比,什么批评语法糖之类的话,我就不说了,去看其他kotlin问题下各路大神的分享。我就说点实在的。
1、kotlin比起java,写的程序代码量少了1/2还多(我的感觉),开发时间也减少不少。
2、kotlin几乎可以调用所有原项目的库和代码。
3、google看样子是要铁了心抛弃java,AndroidStudio3.0已经可以直接新建kotlin项目了,还发新闻说什么“到明年这时候,kotlin在Android将超过50%份额”。
“程序员,我听说Android要换语言啊,那个行不行啊,原来的不是白写了吗?”
“没事,原来的都能用,它能接着往下写”
“那和原来的比咋样啊?干活能快不?”
“能。。这语言简单点。”
“那不快换啊”
“但是老板,kotlin从底层语言来说…它的语法糖…”
“(这傻逼又在说一大堆我听不懂的了)……那不换行不行啊”
“估计不行,谷歌和java打官司呢,估计以后不会用了”
“那还不快给劳资换,磨磨唧唧的”
我的kotlin之旅,准备些写一个系列
update:之后都在专栏里面娓娓道来 - 知乎专栏
两年前,老板正式要求所有新class必须是Kotlin class。我们的app正是进变成Java和Kotlin混合存在,以Java为主导,慢慢向Kotlin转化。Kotlin刚上手,那就是直接写Java,然后拷贝到Kotlin class 里面,因为有自动convert的功能,勉强应付。如果是一个全新的class,那么直接先写Java然后在全部convert到Kotlin。我们的老板是非常好的一个人,第一个Kotlin class,是他坐在我旁边一起改的。我们app的 code base 很大,全是Java,那会只是改改加加小的feature,平时真正要写Kotlin的很少,所以,开始的半年,Kotlin就是打酱油一样用用。我不觉得有多好,而且觉得难用。
现在我们的code从100%的Java变成了30%的Java,Kotlin已经占的大壁江山,而且是老的没有接触到的那部分才是Java,只要在新版本中更新的的或者常用的全是Kotlin。用习惯了Kotlin,效率蹭蹭蹭提高啊。时不时会用到以前的Java code,用几下就觉得不方便,如果要在原来的Java code里面加新code,几行还好,多一点就无法忍受,直接先把Java class转成Kotlin再说。
记得中间,因为个人原因修了几个月的长假,长假之前还都是Java,长假之后全是Kotlin。一回到公司做的第一个feature是我最痛苦的,所有的新的class都是kotlin。Kotlin真的很缩略,老板很兴奋得说我们现在的code多么多么精简,好吧,但是,真的读不懂,好怀念Java,多么readable。写code更痛苦,坐在电脑门前半个小时,写不出几行,千言万语就是写不出来。有人会说,那还是可以先写Java在转化成Kotlin。但那个是初级阶段,大家都在学习。当前的阶段直接从Java转化到Kotlin的code已经不符合我们的要求了,因为直接写Kotlin更精简。
Google I/O 宣布Kotlin正式成Android官方语言,大快人心,不觉就赞一下我们老板的先见之明啊。想当初要用Kotlin的时候,我还百般不愿。
啰啰嗦嗦写了点感慨,下一篇正式讲讲一个java用“Convert to Kotlin”后如何优化kotlin code。
Android Studio,转化Kotlin的功能很强大。如果在Kotlin的文件中,可以直接拷贝Java code到Kotlin中,自动转化。或者可以用“Convert Java File to Kotlin File” 可以自动把Java转化成Kotlin。转化完成后,不是说就好了,还需要优化很多东西。
读者可以先了解一下Kotlin Null Safety
首先把所有的“!!”都去掉。
为什么要去掉“!!”?因为它会产生NullPointerException。如果你很喜欢NPE,那就直接跳过这篇。Kotlin是Null Safety,它最重要的一个功能就是可以帮助app大幅度的减少NPE。开发Android app,NullPointerException,防不胜防。如何减少,我们举个例子。
原始Java
public class VideoView extends FrameLayout {
MediaPlayer mediaPlayer = null;
......
public void pause() {
if (mediaPlayer.isPlaying()) {
mediaPlayer.pause();
}
}
}
转化成Kotlin以后
class VideoView : FrameLayout {
var mediaPlayer: MediaPlayer? = null
......
fun pause() {
if (mediaPlayer!!.isPlaying) {
mediaPlayer!!.pause()
}
}
}
其中 mediaPlayer 是mutable的,也就是说它的值是会改变的。所以这里的mediaPlayer不能是Null, 否则就会产生NPE。Kotlin帮我们找到了原来Java的一个NPE。那么我们要删掉“!!”,应该怎么做呢? 加上if (mediaPlayer != null),可以,但最烦的就是null check。Kotlin可以这样写:
mediaPlayer?.let { // 如果mediaPlayer不是NULL,那么执行if。等同于Null Check。
if (mediaPlayer.isPlaying) {
mediaPlayer.pause()
}
}
这样以后还不对。为什么,因为mediaPlayer是mutable的,它的值是会改变的,有这样的情况,“mediaPlayer?.let{}” null check 的时候它不是null,但当运行“mediaPlayer.isPlaying”的时候如果mediaPlayer的值变化,正好变成null了,那还是会发生NPE。那如何再改呢?
class VideoView : FrameLayout {
var mediaPlayer: MediaPlayer? = null
......
fun pause() {
val mediaPlayer = mediaPlayer
mediaPlayer?.let {
if (mediaPlayer.isPlaying) {
mediaPlayer.pause()
}
}
}
其中:
val mediaPlayer = mediaPlayer
前面的mediaPlayer是一个新的variable,它是read-only,一旦赋值以后是不会变得,而且是local的。后面的mediaPlayer 是上面原来的field变量。
这样就最大程度的减少了NPE。
上面的Kotlin code还可以做的一个改进就是用 lambda,实际上这里就是做了和上面val mediaPlayer = mediaPlayer 一样的事情。如下:
class VideoView : FrameLayout {
var mediaPlayer: MediaPlayer? = null
......
fun pause() {
mediaPlayer?.let {
if (it.isPlaying) {
it.pause()
}
}
}
lambda以后再详述。为什么这里我要把这个拿出来说,因为这个是在转化成Kotlin之后常常碰到的一个问题。
val mediaPlayer = mediaPlayer //也可以写成this.mediaPlayer
3. Kotlin 精简,先说一下,不用动脑筋就可以省去的行数。
第一: single expression function。可以参考Kotlin functions 的single expression function。图片贴不上来,直接看链接吧。意思是:如果一个函数里面只有一个语句,那么可以直接用“=“简化。
举个例子,常见的custom adpater里面都会包括这两个Methods,Java共12行。
@Override
public int getItemCount() {
return items.size() + 1;
}
@Override
public int getItemViewType(int position) {
if (position == 0) {
return TYPE_HEADER;
} else {
return TYPE_ITEM;
}
}
Kotlin 可以这样写,2行就可以。
override fun getItemCount() = items.size + 1
override fun getItemViewType(position: Int) = if (position == 0) TYPE_HEADER else TYPE_ITEM
第二:多用 when Mac上option + enter,“Project quick fix ”,直接可以把 if 转成 when 语句。
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == TYPE_VIDEO_ITEM) {
return new VideoItemViewHolder(parent);
} else if (viewType == TYPE_IMAGE_ITEM) {
return new ImageItemViewHolder(parent);
} else {
return new HeaderViewHolder(parent);
}
return null;
}
转化成Kotlin:
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder? {
return when (viewType) {
TYPE_VIDEO_ITEM -> VideoViewHolder(parent)
TYPE_IMAGE_ITEM -> ImageItemViewHolder(parent)
else -> HeaderViewHolder(parent)
}
}
暂时想到这两个就写到这里。对于我们动不动就几百上千行的文件,省一点是一点,我觉得还是挺好的。不熟悉的时候,看着觉得太省略;熟悉了,一目十行,效率啊
For loop处理
并不是说Kotlin不需要写For loop了,而是大大减少, 而且读起来code来更明了。
首先说一个关键字“forEach”,就是遍历每一个元素。Kotlin非常简洁。举个例子:
// Kotlin
magazineList.forEach { myList.add(MagazineItem(it)) }
// Java
for (int i = 0; i < n; i++) {
MagazineItem newItem = new MagazineItem(magazineList[i]);
myList.add(newItem);
}
第二,Kotlin里面,我觉得非常好用的一个功能就是Sequence。可以简化工作量,结合 forEach 更简单。举几个例子:
1.
// 根据当前的一个“book” list, 把选中的书加到一个selectedTopicsMap中
bookList.filter { it.isSelected }
.forEach { selectedTopicsMap.put(it.id, it) }
// Java
for (int i = 0; i < n; i++) {
if (bookList[i].isSelected) {
selectedBooksMap.put(bookList[i].id, bookList[i]);
}
}
2.
// 产生一个list,这个list是前两本选中的书
val selectedBookList = bookList.filterNot { it.isSelected }
.take(2)
.toList()
3.这个稍微复杂一点。给定两个list:currentItems 和 inlineItems,都是FeedItem的类型
需要得到一个Image的list
这个image的list的要求是:最大长度maxImagesToGet,image可以crop
// kotlin
var currentItems: List<FeedItem> = emptyList()
var inlineItems: List<FeedItem> ?= null
val maxImagesToGet = 10
......
val croppableImages = currentItems.plus(inlineItems?.filter { it.isImage } ?: emptyList())
.mapNotNull { it.availableImage }
.filterNot(it.noCrop)
.take(maxImagesToGet)
//Java
List<FeedItem> currentItems = new ArrayList();
List<FeedItem> inlineItems = new ArrayList();
int maxImagesToGet = 10;
......
int croppableIndex = 0;
List<Image> croppableImages = new ArrayList(maxImagesToGet);
int i = 0;
while (i < currentItems.size() && croppableIndex < maxImagesToGet) {
Image image = currentItems[i].availableImage
if (image != null && !image.noCrop) {
croppableImages.add(image);
croppableIndex++;
}
i++;
}
i = 0;
while (i < inlineItems.size() && croppableIndex < maxImagesToGet) {
if (inlineItems[i].isImage) {
Image image = inlineItems[i].availableImage
if (image != null && !image.noCrop) {
croppableImages.add(image);
croppableIndex++;
}
}
i++;
}
以上举几个小例子,只是用到的sequence中的很少几个,还有很多很好用的函数,大家可以看看,这里没有办法举太复杂的例子
初级工程师,2周Kotlin经验来分享我的视角:
1.无缝的Java互调保证了不会出现什么绕不过的坑
正式使用Kotlin之前尝试过Kotlin与DataBinding同用,但是在.kt文件中import DataBinding相关的类会编译报错,最后把所有与DataBinding相关的代码都放到.java中,在.kt中去调用。不了解Kotlin的反射与Java反射的差异,但是问题大概就是出在这里。
2.Extension 带来的语法糖,甜过初恋
举个栗子,各种system service再也不用强制类型转换了,只需写一个context的extension即可。事实上Anko库已经提供了大量的写好的extension。再也不用为了获取一个简单的service对象需要强制类型转换而换行了。。。我吧一些application wide的东西都存为application的property,让后给context一个extension,以后任何context来获取这些service就是一个简单的读property了。
3.Lambda
衍生出来的Builder,最碉堡的是Anko库可以用Kotlin像写xml一样写洁面了,还有DSL preview插件帮你。。。这样写出来的洁面不但加载速度快(少了xml解析时间),配置各种view也是很方便的。
但是使用lambda也是有坑的,有些以回调为key的方法是不可以使用匿名对象的,否则没法取消。例如蓝牙低功耗扫描时startLeScan(callback: LeScanCallback)stopLeScan(callback: LeScanCallback) 这种,开始和结束是要同一个object的,所以不要使用lambda。其实这个很好理解,lambda很像匿名Runnable,只不过现在是一个获得了一等公民身份的方法。
4.更多新一代语言的语法写起来很爽的,不多表
5.工具链相对完整
有个JetBrains的爹,插件更新紧跟语言版本。各路大神的加持,JakeWharton的好几个库都有Kotlin特别适配版,rx里面都有Kotlin版本了。。(事实上正在用RxKotlin,第一次使用rx)
2017Google I/O将Kotlin正名为Android一级开发语言,着实让Kotlin火了一把。
作为一个半吊子Android开发者咱也抽空看了一下kotlin,谈一点自己的看法。
kotlin作为Java后设计出来的语言,对Java和C#(其实C#对Java做了大量借鉴,或者抄袭,但是对Java中不合理的或者晦涩难懂的地方做了更好的处理,再加上C#与时俱进,每一版本都加入大量的新特性,使其在语法上早已超越了Java)做了大量借鉴,自有其先进的一面。但是kotlin在Android开发当中开发中不会对Java构成实质性的超越。这点从kotlin官网也可以看出。而且其还必须依托Java社区的庞大资源和开发人员。官网从与Java的兼容性,性能,与Java的交互性,内存印记,编译时间以及Java程序员对kotlin的学习曲线等几个方面阐述了其对Android开发的友好支持.
由于其与Java底层的相似性,每一条都不会实质性的超越Java,而且还要榜Java这颗大树。
下面谈一些kotlin语言本身的话题。
其实我本人是比较保守的,喜欢Java或者是C#那种一板一眼的语法,本人一贯奉行"逻辑简单才是真的简单",码多点无所谓。本人比较认同C#对现代语言特性支持的方式,例如本人在好多年前使用C#开发中就感觉C#的扩展方法,lambda表达式,Linq,委托 等用的非常顺手。kotlin对语法的改变有点大,例如:语句无需";"结尾、函数可以定义在类以外、类型后置、函数里面可以声明函数、sealed关键字修饰的类的处理等都让我感到不舒服。而且个人觉得kotlin对Java的改进方面都在模仿C#,顺便说一句,其设计者应该非常推崇《Effective Java》这本经典著作,因为其在说明一些对Java改进的地方时不断引用这本著作。
不管怎么说大家还是应该积极学习这门语言,程序员是苦逼的也是快乐的。
现在中文社区关于kotlin的资源还不太多,可以去官网 学习。官网地址:http://kotlinlang.org/docs/reference/android-overview.html
很多高票回答已经说了很多了。我就说说我这个刚使用 Kotlin 不到三天的人的感受吧。
大概高三的时候就听闻 Kotlin 这个语言了,但一直没有去了解(当时我对于研究这些 experimental 的东西的优先级比较低)。然后今年 Google I/O 宣布 Kotlin 正式成为 Android Official Programming Language 的时候我十分高兴,至少有一个更好的语言可以替代 Java 了。课上我就按耐不住打开文档开始学习,发现这个语言是如此的简洁易懂,因为之前写 iOS,对 Swift 也比较熟悉,所以基本上一节课不到的时间就把 Kotlin 90% 的语法学完了。剩下时间有略微研究了一下 Coroutine 和 kotlinx 的东西。
先说说它相较于 Java 对我比较重要的改进。
首先,Optional 类型,这个就不用多说了,用过 Swift 都知道,对于可能为空属性的连缀非常方便。
其次,Extensions。这个东西太强大了,同样,与 ObjC 和 Swift 类似,你可以为一个已存在的类添加实例方法和属性(不含 companion object 的 class 暂且不支持 static 扩展,官方称后期可能会加入)。这个特性的方便之处就在于,你可能再也不用写一堆 Util 类了,而且配合 Functions with Receiver 这个特性,你可以轻松实现类似 Groovy 那样的闭包写法,DSL 必备啊有木有,给大家看一个我写的 DSL demo:
然后就是 Coroutine 的加入,从上面的例子中也能看出,对于 Android 中大量需要回调一次的异步操作,协程是个非常完美的解决方案,而且支持 Context 的自定义,灵活性很高。当然 Kotlin 的 Coroutine 部分我也是初学,很多东西也在摸索,不过暂时没遇到什么大坑,由于是 experimental feature,后期有大改动的可能性,所以线上项目可以先不用,自己玩玩还是可以。
其他的更多是一些语法和语法糖上的变化,包括属性的一些『新玩法』,比如 delegate、data class、object 单例之类的东西。
另外一个值得一提的是,Kotlin 中所有的 Exception 均为 Unchecked,也就是说,你再也不用写一堆没有意义的 try 了,这其实带来了一个好处,很多人为了应付编译器,写了很多空实现的 catch clause,或者只 printStackTrace 就了事,这其实是个不好的习惯。写程序如果不能把所有异常情况考虑周全,那就遵守『Let it Crash』原则,不然所有异常你都不管,早晚得因为什么致命问题搞炸了。
这几天还把线上的几个 class 给 Convert to Kotlin 了,转换过程无痛,还减少了 40% 的代码量,总之 Kotlin 与 Java 的 Interoperability 还是可以,但是从 Java 中调用 Kotlin 的坑还是有,比如 Spring 中 interface 不兼容,这块还有待我多去研究。
在Dalvik被彻底淘汰之前,Kotlin注定只是个人开发者的玩具。
目前对于业务稍复杂的项目来说,65k方法数的上限是一个必须考虑的问题。
个人预计,未来3-5年Kotlin才会迎来第一波高峰
内部类的方法数消耗:
Java 6: 2
Java 8: 1
Retrolambda: 6
Kotlin w/Runnable: 3
Kotlin with expression: 4
见了太多这种扯皮了。这个语言比那个语言有优势?你觉得的优势往往在别人眼里是劣势。所以别扯什么优越感了。
最大的优势就是“无他,唯手熟尔”!“扯啥语言优势”在这条纲纲面前都要碎一地。
------ 5.23凌晨追加 ------
这几天天天被某种编程语言给包围,现在看看ES 6,真是一股清流啊。犹如天天吃羊肉泡馍,一朝改咸鸭蛋配小米粥,那个清爽……
谷歌不支持,咋就没人问“XX语言好在哪里”呢?所以大概好在哪里就是好在一张脸吧?
Kotlin 就是针对 Java 表达能力的限制而设计的。Java 的最初的哲学是一切都是对象、一件事情只能有一种搞法,有一点儿对 C/C++ 矫枉过正的感觉。
Kotlin 写 JavaBean:data class UserBean(val id: Int, var name: String),相比 field + getter + setter 那一长串确实爽。
Kotlin 的显式optional加链式调用:val name = post?.author?.friends?.get (0)?.name : "none",相比一长串 if-else 也是少打不少字。
-- 打个广告:如果有3年以上安卓经验正好想换工作,请私信我。
在谷歌I/O 2017大会上,谷歌终于正式宣布安卓支持Kotlin啦。
在安卓手机开发中,若想有更简单、更干净的代码,可用Kotlin来代替Java。
正如在IOS开发中,大家对拿Swift对比Objective-C一样,在安卓开发界,大家现在开始都在拿Kotlin与Java作对比。像Swift一样,Kotlin简单、干净,开发相同功能你可以少写很多的代码。Kotlin还添加了Java在Android中尚不支持的一些必备功能。
像许多新的语言一样,Kotlin也是花了好几年时间才被用作商业项目的开发。
Java vs Kotlin以及它们如何无缝衔接在一起
Kotlin语言学习难度相当低,任何有经验的Java开发人员都可以在几个小时内学会Kotlin。Kotlin背后的公司为JetBrains,JetBrains的开发文档、Kotlin背后的开发人员做的都相当好。
在安卓开发中,使用Android Studio,会有很好的工具支持,因为Android Studio就是基于Intellij IDEA社区版开发的,而IntelliJ IDEA也是JetBrains家的。
一旦你安装了Kotlin插件,Android Studio就可以在你的项目中配置Kotlin,就像打开几个菜单一样简单,你的IDE会无师自通,开始理解、编译、运行Kotlin代码。Android Studio还为Kotlin提供了调试、自动完成、代码导航、单元测试和完全重构支持。
Kotlin与Java高度可互操作。Kotlin可以用一种自然的方式调用现有的Java代码,而Java也很容易调用Kotlin代码。同时,Kotlin也可以与JavaScript互操作。开发人员在使用每个单独的语言来测试结果时,也会感觉很舒服。
使用基于Kotlin项目的Java库也很简单,反之也亦然,你可以轻松地在Java代码中用Kotlin语言来新增任何库。
也许Kotlin最大的优势是功能集,Kotlin在Android开发项目添加了一些重要的新功能,这些在Java是没有的。
我最喜欢的一些功能包括:
1、空安全,就是说在编译时期就处理了各种null的情况,避免了执行时异常。如果一个对象可以是null,则我们需要明确地指定 它,然后在使之前检查是否是null。可以节约很多调试nullPointException的时间并解决相应的bug。
2、在Kotlin中,允许对类进行扩展
3、Kotlin支持高阶函数和Lambda表达式
4、自建数据类对象
5、Kotlin通过引入val关键字以及Kotlin集合来强制不变性,Kotlin集合在默认情况下是不可变的
6、协程(Coroutines),类似C#的async/await机制(Kotlin中这两个是函数),lazy generators(yield)等,解决异步计算痛点。(1.1版本最大亮点)
7、Type alias:有利于声明函数类型(1.1版本新增功能)
相比Java,Kotlin的缺点
没有一个编程语言是完美的,虽然Kotlin有很多改进,但是用Kotlin来开发也会面临一些挑战(虽然每个新版本都会改进)。
1、额外运行的大小
最有问题的是:使用Kotlin构建的应用程序文件包比纯粹用Java构建的应用程序文件包更大。这是因为Kotlin有自己的标准库,它被添加在Java标准库之上。如果APK过大,那么用户在下载前可能会做一番思考。
2、编译速度
此外,使用Gradle时,Kotlin编译在完整代码情况下比Java慢一点。这可能令人沮丧。
3、代码初始可读性
虽然Kotlin的简洁语法令人称道,但是起初你会发现,一些Kotlin很难解读,因为代码数量少。Java可能更冗长,但是上面的一切都是明确的。
我没说Kotlin设计得很完美,也没说它设计的不好,只是Java其实没有什么令人讨厌的地方,找不出被代替的理由...
PHP是世界上最好的语言!没有之一!如果你觉得不对请点赞,如果你觉得对也请点赞!
Google就是渣!之前说要用Jack 编译器,我们辛辛苦苦让Coverity支持了这个编译器的静态分析,然后他们又宣布放弃,研发团队已经吃了一次亏了,就怕这次再半途而废。
压不住火...Android 开发工程师从半年前开始接触 Kotlin,在看了两天文档之后就直接上手写
之后把公司的项目使用 kotlin 进行了重构
我自己开发的第三方库和独立应用也完全开始使用 kotlin
下面我就来说一下我切身的体会
100% 与 Java 兼容
我也是我为什么能在简单的熟悉了语法之后就能快速上手写的原因,同时 AS 对 Koltin 的支持也喊好,可以帮助你自动把 Java 转换成 Koltin 语言,也可以把 Kotlin 从字节码反编译回 Java,所以说不会写了就用 Java 写一遍,再转化过来,即学习了语法还读懂了原理。
字符串插值
这也是我很喜欢的地方,在 Android 开发中字符串是最常见的了,一般我们需要使用
String.format()
来拼接显示的字符串,使用 kotlin 只需要这样
“衬衫的价格是$money1镑$money2便士“
money1 和 money 2 就是我们的字段
空安全
这个应该是 kotlin 相对于 Java 一个应以为傲的优点了,作为一个 Java 程序员,空指针异常应该是最常见的 bug,还容易引起 crash
Kotlin 引入了空安全来避免这个问题,类型默认是不允许为空的,可以通过在后面加一个 ? 问号来表示允许为空。
var a: String? = null
这样 a 就是一个可能为空的字段,那么在使用时 IDE 就会提醒我们,这个字段可能为空,我们必须对它处理之后才能使用,很简单通过 a? 来表示。
在我看来,Kotlin 不是没有空指针,只是结合语法和 IDE 的辅助我们在使用可能为空的字段时,必须做处理。
相当于在使用之前做了 if else 的判断,在 Java 中我们常常会忽略这个判断,而在 Kotlin 中就不会了。
扩展函数
这个也是我非常喜欢的一个特性,我们可以对任何类进行扩展,不用通过继承的方式来完成,简单直接!
更好的使用 Lambdas 表达式
Kotlin 对 Lambda 的支持非常好,基于它的优雅简洁的语言设计,语法直接了当,大大提高了代码的可读性。各种函数式编程,简直爽到停不下来!
Kotlin 的优点真的有很多,只有自己使用过后在发现有多么好用,别犹豫啦,快用 Kotlin 开发吧!
可以查看我最近开源的仓库,全部使用 Koltin 来完成
GitHub地址:Werb (wanbo)
欢迎关注我的公众号:Android丨Kotlin
探索有趣的新事物 | Android、Kotlin、设计、产品、思考、游戏。
谷歌在17年举行的I/O开发者大会上宣布,将Kotlin语言作为安卓开发的一级编程语言。于此同时,Kotlin语言一出就上了各大IT门户网站的头条,百度搜索达到300万条,招聘公司已经开始高薪找人,
Kotlin是什么?
可能很多读者看到Kotlin这个单词会感到很陌生,这很正常。就和2007年以前一样,在苹果公司推出iPhone以及相应的开发工具之前,Objective-C就鲜为人知,至少在国内是这样的。上面提到的Objective-C是一种编程语言,而本书的主题是Kotlin,那么首先要回答的是,Kotlin到底是什么呢?没错,Kotlin和Objective-C一样,是一种编程语言。
Kotlin是由JetBrains创建的基于JVM的编程语言,那么JetBrains又是什么呢?我相信很多Java程序员使用过IntelliJ IDEA,这个非常棒的Java IDE(集成开发环境)就是JetBrains的杰作。如果你没听过或没用过IntelliJ IDE,那么也没有太大关系。相信阅读本书的读者或多或少都了解一些Android的知识,Android官方推荐的IDE是Android Studio,简称AS。这个IDE就是基于IntelliJ IDEA社区版开发的。JetBrains旗下不只有IntelliJ IDEA一款产品,Kotlin也是JetBrains旗下的一款产品,一种编程语言。这种编程语言运行在JVM上,也就是Kotlin编译器会将Kotlin源代码编译成Java Byte Code(Java字节码),可以直接运行在JVM上。从这一点看出,在技术层面,Java和Kotlin是同一个级别的,都以Java Byte Code形式运行在JVM上。当然,Kotlin编译器还可以将Kotlin源代码编译生成JavaScript代码,以便在没有JVM的情况下运行。在未来,Kotlin编译器还可以将Kotlin源代码编译生成本地代码,完全脱离任何虚拟机运行,也就是说,Kotlin相对Java的优势之一是多目标编译语言,而Java只能编译生成Java Byte Code(.class文件)。
为什么Kotlin突然成为热门?
尽管Kotlin已经推出有很长一段时间了,但并不怎么出名,可能是因为JetBrains对它的推广力度不够,加之现在的编程语言实在太多了,所以Kotlin就像一块石头扔进了大海,不见了踪影。
那么为什么现在Kotlin突然成为热门了呢?原因也很简单,Kotlin可以开发Android App,而且被Google公司选为开发Android App的一级语言,即在Android Studio 3.0及以上版本中会支持利用Kotlin语言开发Android App。这也就意味着,到目前为止,开发Android 本地App可以使用Java和Kotlin两种编程语言。这就很像开发iOS App的场景了,可以使用Objective-C和Swift两种语言开发iOS App。因此,很多人把Kotlin比作Android世界的Swift。而且Kotlin和Swift的确都是很棒的编程语言,都加入了很多“语法糖”,可以大幅提高程序开发的效率。
Kotlin相对于Java有哪些优势?
可能很多读者会问,既然有了Java,为什么Google公司还要选择Kotlin来开发Android App呢?Kotlin相比Java有哪些优势呢?
在这一节我们来简单了解一下Kotlin的特点,通过这些介绍,我们可以体会到Kotlin的优势所在。
• 更容易学习:Kotlin是一门包含很多函数式编程思想的面向对象编程语言,而且相比Scala语言更容易学习
• 轻量级:相比其他编程语言,Kotlin函数库更小。由于Android存在65K方法数限制,使得这一点显得更为重要。虽然使用ProGuard或者打包成多个dex能够解决这个问题,但是所有这些解决方案都会提高复杂性,并增加调试的时间。Kotlin函数库方法数小于7000个,相当于support-v4(Android 1.6)的大小。
• 高度可互操作性:Kotlin可以和其他Java类库友好且简单地进行互操作。Kotlin团队在开发这门新语言时正是秉承了这个中心思想。他们希望可以使用Kotlin继续开发现有的使用Java语言编写的工程,而不是重写所有代码。因此,Kotlin需要能够和Java很好地进行互操作。
• 非常好地集成Android Studio及Gradle:Kotlin有一个专门用于Android Studio的插件,以及另一个专门用于Gradle的插件。而且即将推出的Android Studio 3.0已经集成了Kotlin,因此在Android工程中开始使用Kotlin并不困难。
当然,Kotlin还有很多语法层面的特性,如数据模型类、空类型安全、扩展函数等,这些技术将会在后面的章节介绍中展开。
Kotlin能做什么?
从前面的内容可以知道,Kotlin可以用来开发Android App,那么除了Android App,Kotlin还可以做什么呢?在本节我们就来一窥究竟。
1.服务端开发
既然Kotlin是基于JVM的编程语言,那么自然而然就可以使用所有基于JVM的服务端框架。下面是几个Kotlin官方文档推荐的框架。
• Spring:一种开源框架,是为了解决企业应用程序开发复杂性问题而创建的。从Spring 5开始,Spring就已经支持Kotlin的新特性了,并可以使用Spring在线生成器(https://start.spring.io)生成基于Kotlin的工程。
• Vert.x:用于建立基于JVM的响应式Web应用的框架。
• Ktor:由JetBrains发布的一款基于Kotlin的本地Web框架
• kotlinx.html:是一种DSL(领域专用语言),用于在Web应用中生成HTML。Kotlin服务端框架和kotlinx.html的关系就像JSP和FreeMarker的关系一样,FreeMarker是基于Java的模板引擎。使用FreeMarker,可以不依赖于HTML或其他技术,可以根据需要生成HTML或其他东西,也就是一种与具体渲染技术无关的技术。
2.以JavaScript方式运行
Kotlin提供了生成JavaScript源代码的能力,也就是将Kotlin代码直接转换为JavaScript代码。目前,支持ECMAScript 5.1标准,未来会支持ECMAScript 6。
注意,如果将Kotlin代码转换为JavaScript代码,在Kotlin代码中只能包含Kotlin标准库,不能包含任何JDK API以及任何第三方的Java Library API,任何不属于Kotlin本身(Kotlin语句和标准库)的部分在转换的过程中将被忽略。
3.开发Android App
这一部分在上文提到过,Kotlin和Java一样,都可以开发Android App,而且Kotlin和Java源代码文件可以在同一个工程中,可以联合进行调试。
尽管Kotlin能做很多事(Java能做的,Kotlin都能做),但本书的主要关注点是开发Android App,因此,在本书后续部分将着重介绍如何利用Kotlin开发Android App。
Kotlin入门,怎么学?
一本全程视频陪伴贴心跟踪初学者学习效果的Kotlin开发书
上一次回答类似问题是在几个月前,kotlin正式被谷歌宣布为官方提供支持的语言。
由于有大量既有JAVA模块存在,生怕转型到kotlin后整个软件产品线出现大的问题。所以我当时的回答是:"和底下的程序员讨论过了,学学可以,但真正是不敢用的"
那么经过这几个月对kotlin的组织学习和评估,其已通过相关团队的评估,可以进入软件产品线了。
目前而已最大的感受就是:
大量语法糖的存在,使得kotlin代码比起java更加整洁。
IO库比起JAVA的IO库设计更为合理一些,没有JAVA的IO库那种装饰类太多带来的弊端。
对既有JAVA模块的支持也是可以的,但是只能当成模块用,如果要拆出部分代码复用,靠自动转编译器kotlin的功能,还是比较不靠谱的。最大的差异就是在涉null和for(i;i;i)的语句转化时并不能符合原意。
好在我们和合作单位维护有完整的产品线,不需要担心旧代码块转化的问题。
在kotlin宣传的涉空预防机制上,本质上就是把后期try catch的判断提前到写代码时,各种意义上增加了编程难度(也不能算是难度吧,而是对每个变量进行定义时要考虑较长的时间)
另外还要说优势的话,那肯定就是官方支持了。后续的安卓版本可能会对kotlin开发有利,这个是我们目前尝试转kotlin的最大原因。
大概就这些吧,目前还没有成型的线上产品,只能说出了点demo一边摸索一边做,相比用了N年的java而言确实没有那么熟悉和了解,部分看法可能有误,仅供参考。