Kotlin, Android的Swift

简介:

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: 572064792 | Nodejs:329118122 做人要厚道,转载请注明出处!













本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sunshine-anycall/p/5223158.html ,如需转载请自行联系原作者

相关文章
|
14天前
|
移动开发 Java Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
【4月更文挑战第3天】在移动开发领域,性能优化一直是开发者关注的焦点。随着Kotlin的兴起,其在Android开发中的地位逐渐上升,但关于其与Java在性能方面的对比,尚无明确共识。本文通过深入分析并结合实际测试数据,探讨了Kotlin与Java在Android平台上的性能表现,揭示了在不同场景下两者的差异及其对应用性能的潜在影响,为开发者在选择编程语言时提供参考依据。
|
15天前
|
数据库 Android开发 开发者
构建高效Android应用:Kotlin协程的实践指南
【4月更文挑战第2天】随着移动应用开发的不断进步,开发者们寻求更流畅、高效的用户体验。在Android平台上,Kotlin语言凭借其简洁性和功能性赢得了开发社区的广泛支持。特别是Kotlin协程,作为一种轻量级的并发处理方案,使得异步编程变得更加简单和直观。本文将深入探讨Kotlin协程的核心概念、使用场景以及如何将其应用于Android开发中,以提高应用性能和响应能力。通过实际案例分析,我们将展示协程如何简化复杂任务,优化资源管理,并为最终用户提供更加流畅的体验。
|
24天前
|
调度 数据库 Android开发
构建高效Android应用:Kotlin协程的实践与优化
在Android开发领域,Kotlin以其简洁的语法和平台友好性成为了开发的首选语言。其中,Kotlin协程作为处理异步任务的强大工具,它通过提供轻量级的线程管理机制,使得开发者能够在不阻塞主线程的情况下执行后台任务,从而提升应用性能和用户体验。本文将深入探讨Kotlin协程的核心概念,并通过实例演示如何在实际的Android应用中有效地使用协程进行网络请求、数据库操作以及UI的流畅更新。同时,我们还将讨论协程的调试技巧和常见问题的解决方法,以帮助开发者避免常见的陷阱,构建更加健壮和高效的Android应用。
32 4
|
26天前
|
移动开发 Java Android开发
构建高效Android应用:Kotlin协程的实践之路
【2月更文挑战第31天】 在移动开发领域,性能优化和流畅的用户体验一直是开发者追求的目标。随着Kotlin语言的流行,其异步编程解决方案——协程(Coroutines),为Android应用带来了革命性的并发处理能力。本文将深入探讨Kotlin协程的核心概念、设计原理以及在Android应用中的实际应用案例,旨在帮助开发者掌握这一强大的工具,从而提升应用的性能和响应能力。
|
27天前
|
安全 Android开发 开发者
构建高效Android应用:Kotlin与协程的完美结合
【2月更文挑战第30天】在移动开发领域,性能优化和流畅的用户体验是关键。本文深入探讨了如何通过结合Kotlin语言和协程技术来提升Android应用的性能和响应能力。我们将分析Kotlin的优势,介绍协程的基本概念,并通过实际案例展示如何在应用中实现协程以简化异步编程,从而提供更加高效的解决方案。
|
16天前
|
Java Android开发 开发者
构建高效Android应用:Kotlin协程的实践与优化
在响应式编程范式日益盛行的今天,Kotlin协程作为一种轻量级的线程管理解决方案,为Android开发带来了性能和效率的双重提升。本文旨在探讨Kotlin协程的核心概念、实践方法及其在Android应用中的优化策略,帮助开发者构建更加流畅和高效的应用程序。通过深入分析协程的原理与应用场景,结合实际案例,本文将指导读者如何优雅地解决异步任务处理,避免阻塞UI线程,从而优化用户体验。
|
21天前
|
Java 编译器 Android开发
构建高效Android应用:探究Kotlin与Java的性能差异
在开发高性能的Android应用时,选择合适的编程语言至关重要。近年来,Kotlin因其简洁性和功能性受到开发者的青睐,但其性能是否与传统的Java相比有所不足?本文通过对比分析Kotlin与Java在Android平台上的运行效率,揭示二者在编译速度、运行时性能及资源消耗方面的具体差异,并探讨在实际项目中如何做出最佳选择。
17 4
|
10天前
|
移动开发 API Android开发
构建高效Android应用:探究Kotlin协程的优势与实践
【4月更文挑战第7天】 在移动开发领域,性能优化和应用响应性的提升一直是开发者追求的目标。近年来,Kotlin语言因其简洁性和功能性在Android社区中受到青睐,特别是其对协程(Coroutines)的支持,为编写异步代码和处理并发任务提供了一种更加优雅的解决方案。本文将探讨Kotlin协程在Android开发中的应用,揭示其在提高应用性能和简化代码结构方面的潜在优势,并展示如何在实际项目中实现和优化协程。
|
24天前
|
移动开发 Android开发 开发者
构建高效Android应用:探究Kotlin协程的优势
在移动开发领域,尤其是针对Android平台,性能优化和流畅的用户体验始终是开发者追求的核心目标。近年来,Kotlin语言凭借其简洁性和功能性成为Android开发的新宠,特别是Kotlin协程的引入,为编写异步代码提供了一种全新的范式。本文将深入探讨Kotlin协程在Android应用开发中的应用及其带来的优势,旨在帮助开发者理解并运用协程来提高应用的性能和响应性。
|
24天前
|
存储 数据库 Android开发
构建高效Android应用:Kotlin协程的全面应用
在现代Android开发中,Kotlin协程作为一种优化异步编程和提升应用性能的强大工具,已经受到越来越多开发者的关注。本文将深入探讨Kotlin协程的核心概念、设计原理以及如何在实际Android项目中实现高效的协程应用。我们将从基础出发,逐步揭示协程如何简化线程管理,提供流畅的代码结构,并通过实际案例分析其在网络请求、数据库操作和UI响应中的应用效果。