Kotlin, Android的Swift

苹果已经用Swift代替Objective-C,一种古老的语言,来进行iOS的开发了。明显Android开发也有这个趋势。

虽然现在已经可以选择Scala或者Groovy等基于JVM的语言开发Android应用来尝尝鲜,但是弊端却显而易见。
要引入一个全新的开发语言,那么就意味着需要引入这个语言的全部的运行时。这简直就是噩梦。因为这会给
极大的增加应用包的大小,还不说65535方法问题。小的应用还可以,但是这不是一个合适的替代语言应该有的问题。

Kotlin

介绍一下Kotlin--一个基于JVM的语言。由JetBrains(他们开发了IntelliJ IDEA的一个系列和Android Studio)
开发,并由圣彼得堡附近的一个小岛命名,负责这个项目的开发团队就在这个小岛办公。在2011年为外界
所致,并在几年后的第二个里程碑(M2)发布了对Android的支持(翻译的时候已经发布了1.0正式版)。

特性

这个新的语言有什么特色呢,你可能会问。有很多!不过本文会集中讲述Java应该有而一直没有的上面。

命名和可选参数

命名参数是一个很简单的语言特性,但是却让代码更加易读,尤其是那些有很多参数的函数签名。

看下面的例子:

void circle(int x, int y, int rad, int stroke) {
    ...
}

在java调用的时候看起来是这个样子的:

circle(15, 40, 20, 1);

要多次查看函数签名才能知道每个参数的具体作用。在Kotlin里,定义是这样的:

fun circle(x: Int, y: Int, rad: Int, stroke: Int) {
    ...
}

调用就更好了:

circle(15, 40, rad = 20, stroke = 1)

假设我们现在需要把stroke参数设定为可选的,在Java里你只能overload出另一个方法,这个方法
少一个参数,然后在里面调用第一个方法:

public void circle(int x, int y, int rad, int stroke) {
    ...
}

public void circle(int x, int y, int rad) {
    circle(x, y, rad, 1);
}

但是在Kotlin里,一切变得简单:

fun circle(x: Int, y: Int, rad: Int, stroke: Int = 1) {
    ...
}

不是什么大的功能改进,但是Java始终没有。

Lambda表达式

最近函数式编程日渐流行。Kotlin也支持lambda表达式。

我们先来看一个简单的。假设你有一个整数列,而且要删除全部的奇数。

val numbers = listOf(1, 2, 3, 4, 5)

println(numbers.filter { it % 2 != 0 })
// 输出:[1, 3, 5]

这个函数把list的元素类型为输入参数类型,这里是integer。并输出一个boolean型的结果。如果我们把
filter的lambda表达式转化为一个明显的变量写出来的就更容易理解了:

val predicate: (Int) -> Boolean = { it -> it % 2 != 0 }
numbers.filter(predicate)

这一语法和其他的而支持lambda表达式的语言的语法相差不大,所以不多做解释。

Null和类型安全

总是要检查变量是否为null也是Java里一个很烦人的事。这个问题在Kotlin里被部分解决。

如果你用传统的方法定义一个变量,那么编译器是不允许其值为null的。

var text1: String = "something" // 木有问题
var text2: String = null // 无法编译

那么定义的变量的值需要为null怎么办呢?你要专门定义一个值可为null的变量。值可为null的变量,用变量
类型后面的问号来明确指定。

var text2: String? = null // 木有问题

调用的时候也需要问号。

text2?.replace(" ", "-")

这句的意思是:如果text2为空,那么replace()方法会被忽略并且不会有NullPointerException异常抛出。

如果你接手了一个可选类型(optional type)的变量,你可以百分之百的确认变量的值不会为null(这在Adnroid的API里
非常多见,虽然方法定义返回值为空可空类型,但是从来不会返回null),然后可以强制作为非空调用方法。

text2!!.replace(" ", "-")

这个时候,如果text2为null的话就会抛出NulPointerException异常。所以小心使用。

类型安全的另一个意义是类型检测。假设你又一个Context的实例并且需要检测这个实例是否为Activity类型,然后调用
一些activity才有的方法。

val context = getContext()
if (context is Activity) {
    context.finish()
}

类型检测之后你就可以把context作为一个activity类型的实例来使用了,不需要强制类型转换。和Java的
instanceOf方法一样,is也是null安全的。即使getContext()返回一个null,上面的代码也
不会崩溃。

数据对象(Data object)

在写数据对象的时候,很多你需要手动实现的,比如:toString(), 'hashCode()以及equals()`。即使
现在很多的IDE已经减轻了一部分工作量,但是添加了新的成员后再更新这些实现也是非常的麻烦。

Kotlin里不用再为这些操心了。你需要做的只是在类定义的前面加一个data的修饰,上面的方法就已经隐式的生成了。

data class Island(val name: String? = null)

如果你初始化上面的类,会自动生成一个人类可以读懂的toString()方法。

val island = Island("Kotlin")
println(island.toString())  // 输出:Island(name=Kotlin)

同理,如果我们用同一个名字创建另外一个实例,这个实例会equal之前创建的实例。并且他们的hashCode()值也一样。

val island = Island("Kotlin")
val island2 = Island("Kotlin")

assert(island.equals(island2))
assert(island.hashCode() == island2.hashCode())

如果你要定制以上的方法,那么,当然,你还是要手写的。

单例

单例是一个非常常用的方法。Kotlin省去了创建单例的时候需要的静态getInstance()方法和私有的构造函数。
Kotlin使用object声明。

object ApiConfig {
    val baseUrl: String = "https://github.com"
}

object声明也可以用来创建静态方法。

open class MyFragment : Fragment() {
    companion object {
        fun newInstance(): MyFragment = MyFragment()
    }
}

上面的方法可以这样调用val fragment = MyFragment.newInstance(),就和Java的静态方法一样。

接口

虽然Kotlin不支持多继承, 但是还是支持接口的。只不过这个接口和Trait比较接近,可以在接口中包括默认实现。

interface SessionCloseable {
    fun closeSession() {
        Log.d(SessionCloseable::class.java.simpleName, "Closing...")
    }
}

以上接口定义了一个可以关闭session的方法,下面我们在一个activity里实现这个方法。

class KotlinActivity : Activity(), SessionCloseable {
    override fun onStop() {
        super.onStop()
        closeSession()
    }
}

有一点需要注意的是Kotlin里没有extend和implement的区分,什么时候都是逗号分隔。

扩展(extension)

最后我们看一个例子:你可以给一个已经存在的类添加方法。

比如你要创建一个方法,这个方法可以把字符串的空白替换为下划线。在Java里你需要创建一个Utility的方法,以
原始字符串为参数。

public class StringUtils {
    public static String encodeString(String str) {
        return str.replaceAll(" ", "_");
    }
}

在Kotlin里,你可以创建一个扩展方法(extension function),即使原类是final的。

fun String.encodeSpaces(): String {
    return this.replace(" ", "_")
}

最后

为了公平起见,以上说到的大部分特性在Java8里都已经有了。但是这些什么时候可以在Android里用到可能
就遥遥无期了(其实这个问题已经有人在2014的Google I/O里问过了,但是根据Xavier Ducrohet的说法近期没有这样的计划)。
还好现在有Kotlin了。

另外,这个语言已经非常的成熟。唯一的问题就是文档经常补全而且还经常是过期的,不过因为语法和同时JVM语言的Scala多少
有些接近,多少可以猜出个大概。所以,这只是一个很小的瑕疵。

最后的最后,Kotlin将会在我(作者)后续的Android开发中尽可能的使用。显然,对已有的代码做转化不太明智。
而且Kotlin可以和Java的代码无缝互操作,这样不是什么太大的问题。Kotlin很值得一试!

原文地址, 代码在这里

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 330987132 | Go:217696290 | Python:336880185 | 做人要厚道,转载请注明出处!http://www.cnblogs.com/sunshine-anycall/p/5223158.html

时间: 2024-08-30 11:09:18

Kotlin, Android的Swift的相关文章

hello Kotlin (android 的swift)

1.1 Kotlin的身世 写了许久 Java,有没有发现其实你写了太多冗余的代码? 后来你体验了一下 Python,有没有觉得不写分号的感觉真是超级爽? 你虽然勤勤恳恳,可到头来却被 NullPointerException 折磨的死去活来,难道就没有受够这种日子么? 直到有一天你发现自己已经写了好几十万行代码,发现居然全是 getter 和 setter! 哈哈,实际上你完全可以不用这么痛苦,用 Kotlin 替代 Java 开发你的程序,无论是 Android 还是 Server,你都能像

Swift 就像 Kotlin?看看 Swift 与 Kotlin 的简单对比

一位国外的程序员认为 Swift 的语法与 Kotlin 相似,并整理了一些 Swift 和 Kotlin 的对比,下面是一些例子,大家不妨也看看. BASICS Hello World Swift print("Hello, world!") Kotlin println("Hello, world!") 变量和常量 Swift var myVariable = 42 myVariable = 50 let myConstant = 42 Kotlin var m

Kotlin如何成为我们Android开发的主要语言

引言 Kotlin是一个基于JVM的新的编程语言,由JetBrains开发.JetBrains,作为目前广受欢迎的Java IDE IntelliJ的提供商,在Apache许可下已经开源其Kotlin编程语言.与Java相比,Kotlin的语法更简洁.更具表达性,而且提供了更多的特性,比如,高阶函数.操作符重载.字符串模板.它与Java高度可互操作,可以同时用在一个项目中. Kotlin的定位非常有特点,它并不像Scala那样另起炉灶,Scala是一切尽量自己来,将类库,尤其是集合类都自己来了一

使用Kotlin开发Android应用的初体验

昨晚,最近一届的谷歌IO大会正式将Kotlin确定为了官方开发语言,作为一名Android开发鸟,怎么能不及时尝尝鲜呢? Kotlin的简要介绍 在开发之前,很多同学一定有很多疑问,Kotlin到底有啥好处,怎么和现有的项目共存呢?Java那么些特性Kotlin都有吗?嗯,让我们一一来看. Kotlin 非常适合开发 Android 应用程序,将现代语言的所有优势带入 Android 平台而不会引入任何新的限制: 兼容性:Kotlin 与 JDK 6 完全兼容,保障了 Kotlin 应用程序可以

Kotlin在Android工程中的应用详解

Kotlin在Android工程中的应用 原文链接 简介 Kotlin是由JetBrains设计的开放源码的编程语言,它正在Java开发者中变得越来越流行.Kotlin通常被吹捧为Java的继承者,相比较Java而言,Kotlin提供更为丰富的开发经验,因为它更现代,更具表现力和更简介. 如果你在寻求Android开发的可替代编程语言,那么应该试一下Kotlin.使用Kotlin,你可以很容易的在Android工程中替代Java或者与Java混合使用. 本文接下来将介绍在Android Stud

再不学就OUT了!学习 Kotlin 的 20 个实用资源

Кotlin 是在 Java VM 上运行的现代编程语言,它的语法优雅,可与现有的 Java 库互操作. 在 2017 年 Google I/O 中,Android 团队宣布将 Kotlin 作为 Android 平台的官方编程语言. 为了帮助你学习和了解 Kotlin ,本文整理出了 Kotlin 学习资源列表,当中没有任何付费课程或书籍,列表中的所有内容都是 100% 免费.(含外境资源,请自备梯子) 一.教程类 The Kotlin Website - Kotlin 官网 Kotlin 官

学 Kotlin,看这一篇就够了

为什么学习Kotlin? 欢呼声热烈 谷歌宣布 Kotlin 成 Android 开发一级语言 Kotlin on Android. Now official 17 位谷歌 Android 开发专家是如何看待 Kotlin 的? 为什么你该摒弃 Java ,全面转向 Kotlin 语言? 为什么说Kotlin值得一试 如何学习Kotlin? 官网以及相关文档 Kotlin 官网 Kotlin 文档 Kotlin 博客 Kotlin 中文文档 Kotlin on GitHub Kotlin开发实践

[Android]异步 layout inflation(翻译)

以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5829809.html 异步 layout inflation 原文:https://medium.com/@lupajz/asynchronous-layout-inflation-7cbca2653bf#.q22vpezg4 随着最近发布的Android Support Library, revision 24,Google开发者在v4包中增加了一个用来异步

Kotlin开发实战之hello world

工欲善其事必先利其器,工具的安装基于Android studio 2.2.3 Kotlin下载安装(这边我已经安装了就不卸载重新装了,搜索到后直接点击install按钮安装,然后重启就Ok了) Kotlin插件的支持 在自己引用的build_gradle 中添加插件 apply plugin: 'com.android.application' apply plugin: 'kotlin-android' 然在Project中添加依赖 buildscript { ext.kotlin_versi