Moosphan / Android-Daily-Interview

:pushpin:每工作日更新一道 Android 面试题,小聚成河,大聚成江,共勉之~

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2019-05-31:请简述一下什么是 Kotlin?它有哪些特性?

Moosphan opened this issue · comments

2019-05-31:请简述一下什么是 Kotlin?它有哪些特性?
commented

额,盲答一波。
kotlin是一种开发语言,和java一样都是静态编程语言,和java相比安全性更高,从机制上避免空指针,省去注解麻烦,代码更简洁,拓展性比java语言更好。
哦了,就想到这么多...

设计理念
1、创建一种兼容Java的语言
2、让它比Java更安全,能够静态检测常见的陷阱。如:引用空指针
3、让它比Java更简洁,通过支持variable type inference,higher-order functions (closures),extension functions,mixins and first-class delegation等实现。
4、让它比最成熟的竞争对手Scala语言更加简单。
Kotlin优势
1、简洁: 大大减少样板代码的数量。
2、安全: 避免空指针异常等整个类的错误。
3、互操作性: 充分利用 JVM、Android 和浏览器的现有库。
4、工具友好: 可用任何 Java IDE 或者使用命令行构建。

我补充一些东西吧。kotlin和java都是运行在java虚拟机的语言。编译后都会生成.class文件。而虚拟机运行的正是.class文件。所以两者都可以用来写Android。再说说个人的一些看法。java作为一门相对时间长一点的语言。相对来说更万能一些。基本上能完成所有的开发场景。而且,因为时间够久,相对来说问题也很少,虽然大家都吐槽分号,类型转换,空指针这些傻瓜操作,但是我并没有觉得不写这些就能对我的开发有质的的提升,唯一让我想学kt的动力就是google的Android实例将来要用kt写。而kotlin作为一门新语言,有他自己的优点,也有一些缺点。具体什么缺点大家看下面的文章吧。

从java到kotlin,再从kotlin回归java

kotlin和java一样也是一门jvm语言最后的编译结果都是.class文件,并且可以通过kotlin的.class文件反编译回去java代码,并且封装了许多语法糖,其中我在项目中常用的特性有

1.扩展,(使用非集成的方式 扩张一个类的方法和变量):比方说 px和dp之间的转换 之前可能需要写个Util
现在,通过扩展Float的变量 最后调用的时候仅仅是 123.dp 这样px转成dp了

2.lamdba表达式,函数式编程. lamdba表达式并不是kotlin的专利,java中也有,但是有限制, 像setOnClickListener一样,接口方法只有一个的情况才能调用, 而在kotlin中对接口的lambda也是如此,有这样的限制,但是他更推荐你使用闭包的方式而不是实现匿名接口的方式去实现这样的功能,闭包对lambda没有接口这么多的限制,另外就是函数式编程 在java8中提供了streamApi 对集合进行map sort reduce等等操作,但是对android api有限制,为了兼容低版本,几乎不可能使用streamApi

3.判空语法 省略了许多if xxx==null 的写法 也避免了空指针异常
aaa?.toString ?: "空空如也" 当aaa为空的时候 它的值被"空空如也"替代
aaa?.let{
it.bbb
}
当aaa不为空时 执行括号内的方法

4.省略了findViewById ,使用kotlin 就可以直接用xml中定义的id 作为变量获取到这个控件,有了这个 butterknife就可以淘汰了,使用databinding也能做到,但是,非常遗憾,databinding的支持非常不好,每次修改视图,都不能及时生成,经常要rebulid才能生成.

5,默认参数 减少方法重载 fun funName(a :Int ,b:Int = 123)
通过如上写法 实际在java中要定义两个写法 funName(a) 和funName(a,b)

6.kotlin无疑是android将来语言的趋势,我已经使用kotlin一年了,不仅App工程中使用,而且封装的组件库也是用kotlin,另外说明,kotlin会是apk大小在混淆后增加几百k.但对于更舒适的代码来说这又算的了什么呢
下面是我封装的kotlin开发脚手架
https://github.com/manondidi/kotlinArch

多亏使用了JVM,我们可以使用任何语言去编写 Android应用,只要它能够编译成JVM能够认识的字节码就可以了。
正如你所想,有很多选择,比如Groovy,Scala,Clojure,当然还有Kotlin。通过实 践,只有其中一些能够被考虑来作为替代品。
上述的每一种语言都有它的利弊,如果你还没有真正确定你该使用那种语言,我建
议你可以去尝试一下它们。
10
什么是Kotlin?
什么是Kotlin?
Kotlin,如前面所说,它是JetBrains开发的基于JVM的语言。JetBrains因为创造了 一个强大的Java开发IDE被大家所熟知。Android Studio,官方的Android IDE,就 是基于Intellij,作为一个该平台的插件。
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两 种语言混合编程。

备注:摘自kotlin文档中文版-PDF

还没开始喝这碗汤呢 java不精 Android不通 路漫漫其修远兮

kotlin就是为了跟java不一样,搞出奇奇怪怪的语法以及一些看起来很方便的语法糖,为了取代java独树一帜的逗比语言

你是没怎么用过kotlin吧,建议你学习一下C#和js的函数式编程再来评论,而且kotlin 集合语法糖真的很好用

Kotlin 和 Java 都一样都是基于 JVM 的静态开发语言,Kotlin目前是完全兼容 Java 的,也称更好的 Java。

目前也是 Google 认定的 Android 官方开发语言。

相对于 Java 来说更现代化,除了支持面向对象还支持了函数式编程,引入了高阶函数,内联函数,扩展函数等概念,对 lambda 也有很好的支持,还有很多语法糖在开发过程中也是减少了很多的样板代码,我感觉在类型系统的改变是特别大的,可空和不可控类型在语法层面分开虽说不能彻底杜绝空指针但是在编译期就能检测出来很多空指针风险也是不错的,还有对泛型的支持在语法层面使用关键字 out 和 in 可以更好的理解型变,相对于 Java 来说这种语法层面的优化还有很多,目前也是在不断的迭代中。

1、函数是头等公民
2、lambda表达式
3、模式匹配
4、解构
5、高阶函数
等等太多了