Kotlin:Android世界的Swift

2023-11-14

转载自:
http://www.infoq.com/cn/news/2015/06/Android-JVM-JetBrains-Kotlin

Kotlin 是一门与 Swift 类似的静态类型 JVM 语言,由 JetBrains 设计开发并开源。与 Java 相比,Kotlin 的语法更简洁、更具表达性,而且提供了更多的特性,比如,高阶函数、操作符重载、字符串模板。它与Java高度可互操作,可以同时用在一个项目中。

按照 JetBrains 的说法,根据他们多年的 Java 平台开发经验,他们认为Java编程语言有一定的局限性和问题,而且由于需要向后兼容,它们不可能或很难得到解决。因此,他们创建了 Kotlin 项目,主要目标是:

  • 创建一种兼容Java的语言
  • 编译速度至少同Java一样快
  • 比Java更安全
  • 比Java更简洁
  • 比最成熟的竞争者Scala还简单

Ashraff Hathibelagal是一名喜欢研究新框架和 SDK 的独立开发者。近日,他撰文介绍了 Kotlin 的一些语法。按照他的说法,一个合格的 Java 程序员可以在很短的时间内学会使用 Kotlin

类与构造函数

Kotlin 创建类的方式与 Java 类似,比如下面的代码创建了一个有三个属性的 Person 类:

class Person{
    var name: String = ""
    var age: Int = 0
    var college: String? = null
}

可以看到,Kotlin 的变量声明方式略有些不同。在 Kotline中,声明变量必须使用关键字 var,而如果要创建一个只读/只赋值一次的变量,则需要使用 val 代替它。另外,为了实现“空安全(null safety)”,Kotlin 对可以为空的变量和不可以为空的变量作了区分。在上述代码中,变量 nameage 不可为空,而 表明变量 college 可以为空。定义完类之后,创建实例就非常简单了:

var jake = Person()

注意,Kotlin 没有关键字 new。实例创建完成后,就可以像在 Java 中一样为变量赋值了:

jake.name = "Jake Hill"
jake.age = 24
jake.college = "Stephen's College"

变量可以采用上述方式赋值,也可以通过构造函数赋值,但后者是一种更好的编码实践。在 Kotlin 中,创建这样的一个构造函数非常简单:

class Person(var name: String, var age: Int, var college: String?) {
}

而实际上,由于构造函数中没有其它操作,所以花括号也可以省略,代码变得相当简洁:

class Person(var name: String, var age: Int, var college: String?)

var jake = Person("Jake Hill", 24, "Stephen's College")

上述代码中的构造函数是类头的一部分,称为主构造函数。在 Kotlin 中,还可以使用 constructor 关键字创建辅助构造函数,例如,下面的代码增加了一个辅助构造函数初始化变量 email

class Person(var name: String, var age: Int, var college: String?) {

    var email: String = ""

    constructor(name:String, age:Int, college: String?, email: String) : this(name, age, college) {
        this.email = email
    }
}

Kotlin允许创建派生类,但要遵循如下规则:

  • 必须使用:代替Java中的extends关键字
  • 基类头必须有open注解
  • 基类必须有一个带参数的构造函数,派生类要在它自己的头中初始化那些参数

比如下面的代码创建了一个名为 Empoyee 的派生类:

open class Person(var name: String, var age: Int, var college: String?) {
    ...
}

class Employee(name: String, age: Int, college: String?, var company: String) : Person(name, age, college) {
}

函数与扩展

有派生就有重载。与类的派生一样,允许重载的方法要有 open 注解,而在派生类中重载时要使用 override 注解。例如,下面是在 Employee 类中重载 Person 类的 isEligibleToVote 方法的代码:

override fun isEligibleToVote(): Boolean {
    return true
}

除了改变类的已有行为,Kotlin 还允许开发者在不修改类的原始定义的情况下实现对类的扩展,如下面的代码为 Person 类增加了一个名为 isTeenager 的扩展:

fun Person.isTeenager(): Boolean {
    return age in 13..19
}

在需要扩展来自其它项目的类时,这个特性特别有用。

上面提到的函数都与 Java 中的函数类似,但 Kotlin 还支持其它类型的函数。如果一个函数返回单个表达式的值,那么可以使用 = 来定义函数。下面是一个创建单表达式函数的例子:

fun isOctogenarian(): Boolean = age in 80 .. 89

Kotlin 还支持高阶函数和 Lambda 表达式。例如,lambda 表达式 *{x,y->x+y} *可以像下面这样给一个变量赋值:

val sumLambda: (Int, Int) -> Int = {x,y -> x+y}

而下面的高阶函数将上述表达式作为一个参数,并将表达式的计算结果翻倍:

fun doubleTheResult(x:Int, y:Int, f:(Int, Int)->Int): Int {
    return f(x,y) * 2
}

该函数可以使用下面的其中一种方式调用:

val result1 = doubleTheResult(3, 4, sumLambda)

val result2 = doubleTheResult(3, 4, {x,y -> x+y})

范围表达式

Kotlin 中,范围表达式用的比较多。范围创建只需要 .. 操作符,例如:

val r1 = 1..5
//该范围包含数值1,2,3,4,5

如果创建一个降序范围,则需要使用 downTo 函数,例如:

val r2 = 5 downTo 1
//该范围包含数值5,4,3,2,1

如果步长不是1,则需要使用step函数,例如:

val r3 = 5 downTo 1 step 2
//该范围包含数值5,3,1

条件结构

在Kotlin中,if是一个表达式,根据条件是否满足返回不同的值,例如,下面的代码将isEligibleToVote设置为“Yes”

var age = 20
val isEligibleToVote = if(age > 18) "Yes" else "No"

when 表达式相当于 Javaswitch,但功能更强大,例如,下面的代码将 typeOfPerson 设置为“Teenager”

val age = 17

val typeOfPerson = when(age){
    0 -> "New born"
    in 1..12 -> "Child"
    in 13..19 -> "Teenager"
    else -> "Adult"
}

循环结构

Kotlin使用 for..in 遍历数组、集合及其它提供了迭代器的数据结构,语法同 Java 几乎完全相同,只是用 in 操作符取代了: 操作符,例如,下面的代码将遍历一个 String 对象数组:

val names = arrayOf("Jake", "Jill", "Ashley", "Bill")

for (name in names) {
    println(name)
}

whiledo..while 循环的语法与 Java 完全相同。

字符串模板

Kotlin 允许在字符串中嵌入变量和表达式,例如:

val name = "Bob"
println("My name is ${name}") //打印"My name is Bob"

val a = 10
val b = 20
println("The sum is ${a+b}") //打印"The sum is 30"

此外,KotlinJava 高度可互操作。Kotlin 可以用一种自然的方式调用现有的 Java 代码,而 Java 也很容易调用 Kotlin 代码。同时,Kotlin 也可以与 JavaScript 互操作。

上面介绍的只是 Kotlin 的一些基本语法和特性,更多细节请查阅官方文档。事实上,到目前为止,Kotlin 还仍然只是一个预览版本,接下来的几个月中还会有多项重大改进及新增特性。尽管如此,GitHub 上已有 4000 多个与 Kotlin 项目相关的库

在另外一篇文章中,Hathibelagal 写道,“如果你正在为 Android 开发寻找一种替代编程语言,那么应该试下 Kotlin。它很容易在 Android 项目中替代 Java 或者同 Java 一起使用。”想要了解如何在 Android Studio 中使用 Kotlin 开发Android项目的读者,可以读下这篇文章。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin:Android世界的Swift 的相关文章

  • Java GUI,根据actionListener更改面板

    我在两个不同的面板中添加了两个按钮 如果单击第一个按钮 则需要转到下一个面板 其中包含第二个按钮 但是当我单击第一个按钮时 该按钮没有被替换 Java GUI import java awt event ActionEvent import
  • Android 视图可见性消失

    如果我设置了一个视图可见性 它被夸大了 消失了 它会加快我的 UI 速度吗 它将加快 UI 的实际绘制速度 因为 好吧 您不必再绘制它 但它仍然会膨胀 并且膨胀过程不会更快
  • 如何知道 Solr Optimize 何时完成?

    我正在使用 Solr php client 通过 php 与 Solr 进行通信 这段代码触发solr优化命令 solr gt optimize 请问有没有什么方法可以确定优化完成了 这都是因为我的网站上有一个管理页面 我每天必须手动优化
  • 在 Android 上解析 RSS

    我有几个 RSS 源需要为我的应用程序进行解析 我按照这里的优秀教程进行操作 http w2davids wordpress com android rssatom feeds parsing with rome http w2davids
  • Java 会话变量

    我听说有些人认为在会话中将信息存储在服务器上是一个坏主意 因为它不安全 因此 在多页面业务流程功能中 应用程序将数据写入数据库 然后在需要时检索信息 在会话中存储私人信息是否一定不安全 只要会话本身安全 在会话中存储属性就不存在安全风险劫持
  • SpannableString 中的 URLSpan

    我正在使用这个例子SpannableString http developer android com resources samples ApiDemos src com example android apis text Link ht
  • java代码的等效vb代码

    谁能告诉我这段Java代码到底做了什么 SecureRandom random SecureRandom getInstance SHA1PRNG byte bytes new byte 20 synchronized random ran
  • Maven 依赖冲突:org.w3c.dom.ElementTraversal

    我有一个 Java 代码库 它使用 Maven 进行依赖项解析并在 CI 上运行测试 经过最近的一批开发 大到足以很难识别重大更改 我的一些测试现在在通过 Maven 运行时失败了NoClassDefFoundError for org w
  • 使用 spring mvc 的多个域

    假设我有一个应用程序必须缩短 URL 但还要执行其他操作 喜欢google com and goo gl or facebook com and fb me 部署两个应用程序很容易 但 目前 仅部署一个应用程序更简单 使用 spring 和
  • spring-hibernate 花费更多时间的任何原因?

    目前 我正在春季和冬眠期间从事一个项目 我来到这里 获取记录并在 JSP 中显示这些记录需要更多时间 我在各处都保留了时间戳 以查看哪里花费了更多时间 Time HomeController start 2014 07 09 18 58 5
  • 如何删除 Spring 的 RestTemplate 添加的某些 HTTP 标头?

    我在远程服务方面遇到问题 我无法控制对使用 Spring 的 RestTemplate 发送的请求进行 HTTP 400 响应 使用发送的请求curl但被接受了 所以我将它们与通过 RestTemplate 发送的内容进行了比较 特别是 S
  • 如果使用 Maven,是否应该忽略 VCS 中 Eclipse 特定的文件?

    我知道为什么不将 Eclipse IDE 特定的文件提交到像 Git 我实际上正在使用的 这样的 VCS 中 这就是我使用 Maven 并让它为您生成这些文件的原因之一not将它们置于版本控制之下 但我想知道 是否应该在 gitignore
  • 只需更新一个小部件 RemoteViews 而不是完全创建一个新小部件?

    在 AppWidgetProvider 类的 onUpdate 方法中 我最终执行了大量代码 以便我可以完全重新创建一个新的 RemoteView 对象 现实是 每次更新时 我实际上只需要在 RemoteView 中的 TextView 之
  • 使用用户名和密码登录 LinkedIn 失败

    LinkedIn使用oauth登录其api 服务器中无法登录api 我尝试使用http请求登录linkedin并获取oauth verifier 但我得到了这样的回应 很抱歉 出现了问题 你的申请 请确保您 启用cookie并重试 或点击此
  • Android BottomNavigationView 与自定义视图作为图标[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我正在尝试 Android 支持库中的新 BottomNavigationView 对于其中一个菜单项 我希望有一个自定义视图 以便我
  • 如何在 Android 中通过 gradle 列出 buildConfig 中的所有类型

    这是一个简单的 gradle 具有三种风格 apply plugin com android application android compileSdkVersion 23 buildToolsVersion 23 0 2 default
  • Mac 上的 JavaFX WebView 字体问题

    有些网站显示乱码而不是正确的文本 它只发生在 Mac 上 For example with GMapsFX 可能与 OS X 10 11 或 10 12 有关 我用Java 1 8 0 121测试了它 此问题有任何修复或解决方法吗 就我而言
  • java有类似C#的属性吗? [复制]

    这个问题在这里已经有答案了 C 属性 我的意思是 get 和 set 方法 是一个非常有用的功能 java 也有类似 C 的属性吗 我的意思是我们如何在 java 中实现类似以下 C 代码的内容 public string Name get
  • iOS:如何实现像Android的startActivityForResult这样的行为

    我是一名 Android 开发人员 正在开发我们应用程序的 iOS 版本 我需要知道如何在 Android 上实现类似于 startActivityForResult 的行为 我需要显示一个新的视图控制器 然后在新的视图控制器关闭时将控制权
  • 扩展Android应用程序类

    当我正在寻找从远程设备获取错误报告的解决方案时 就像 iOS 中的试飞应用程序一样 我发现了acra适用于 Android 设备here http code google com p acra wiki BasicSetup 在基本设置中

随机推荐

  • Ubuntu下使用摄像头遇到的问题

    VIDEOIO ERROR V4L can t open camera by index 1 我在Linux下使用opencv库调用摄像头cvCreateCameraCapture 0 时出现该错误 原因是在 dev下video0变成了vi
  • 目标检测之YOLOv2算法分析

    要点 Batch Normalization 训练 若batchsize 64 某一层的某一个神经元会输出64个响应值 对这64个响应值求均值 标准差 然后标准化 对标准化的结果乘 lambda beta 其中
  • Cannot find template location: classpath:/templates/ (please add some templates or check your Thymel

    springboot配置了 thymeleaf 启动warning Cannot find template location classpath templates please add some templates or check y
  • 抓包相关,抓包学习

    检查网络流量 提琴手经典 telerik com Headers Reference Fiddler Classic telerik com 以上是fiddler官方文档 F12要勾选保留日志 不勾选的话跳转到新页面之前页面的日志不会在下方
  • 02-407控制底板PCB开发板资源介绍资料

    核心板 控制底板 反客 DIY 1 芯片介绍 stm32F407ZGT6 开发指南 产品 见淘宝 反客科技 核心板并没有使用STM32F407开发指南上的 因为它贵且许多功能没有用到 所以就使用反客的 芯片的一样 没事 开发板是李明枫老师画
  • C语言计算1-100之间的素数

    要计算素数 我们首先要明白素数的性质 也就是我们数学上的质数其实是一样的啦 素数 只能被一和它本身整除的数 这里提一下1既不是质数也不是合数 感觉想把自己说得话注释也挺难的哈 挺多地方写的应该看不懂吧反正我自己也有点看不懂自己写的啥哈哈 运
  • 这7个GitHub高级搜索技巧,你知道吗?

    前言 GitHub作为全球最大的同性交友 代码托管 平台 里面藏着巨大的资源宝库 一套Ctrl C和Ctrl V组合拳打出来 就没有你实现不了的需求 好了 废话不多说 下面介绍7个GitHub搜索高级技巧 让资源搜索不再困难 关键字 in
  • JPA——Date拓展之Calendar

    Java Calendar 是时间操作类 Calendar 抽象类定义了足够的方法 在某一特定的瞬间或日历上 提供年 月 日 小时之间的转换提供方法 一 获取具体时间信息 1 当前时间 获取此刻时间的年月日时分秒 Calendar cale
  • python卸载_可能是全网最详细的 Python 安装教程(windows)

    Python 是这两年来比较流行的一门编程语言 主要卖点是其相对简单的语法以及丰富的第三方库 下面我来带大家安装 配置 Python 文章最后有各种疑难杂症的解决方法 大体步骤有两步 安装 Python 让电脑学会这门语言 配置编辑器 方便
  • 让chatGPT回答一些有趣?无聊的问题

    本来我是没有国外的手机号的 也就没法注册chatGPT并使用 不过好在 csdn 的猿如意 里面有体验功能 我就顺便体验一下 这一次主要是看看chatGPT能否理解我的目的 很可惜 这一次并没有 其实第一次 chatGPT准确的回答出了 自
  • 算法导论 练习 2.2

    2 2 1 答案 n theta n 渐进符号的定义会在第三章里明确给出 所以这里就不写证明了 详细证明见第三章习题 好多好多啊 2 2 2 选择排序 数据结构课程基本排序算法之一 代码 SELECTION SORT A n length
  • 算法研究---MNIST数据集

    MNIST简介 MNIST Mixed National Institute of Standards and Technology database 是一个计算机视觉数据集 它包含70000张手写数字的灰度图片 其中每一张图片包含 28
  • vue3按需导入element-plus后使用ElMessage报错或样式丢失

    在vue项目中已经自动导入element plus 但是直接使用ElMessage时编译会报错 async function userLogin Promise
  • 史上最全《计算机网络 自顶向下方法》答案合集

    史上最全 计算机网络 自顶向下方法 答案合集 封面 英文名 Computer Networking A Top Down Approach 7th Edition 答案 第一章 一 第一章 二 第二章 一 第二章 二 第三章 一 第三章 二
  • .NET Core API框架实战(五) 依赖注入 服务的注册与提供

    ASP NET Core 的底层设计支持和使用依赖注入 ASP NET Core 应用程序可以利用内置的框架服务将它们注入到启动类Startup的方法中 并且应用程序服务ConfigureServices能够配置注入 依赖注入 Depend
  • 【Unity入门计划】利用Cinemachine实现简单的相机跟随&设置相机边界

    目录 使用情景 1 从Packages载入Cinemachine 2 创建2D Camera的Cinemachine 3 设置摄像机跟随玩家角色 4 设置主摄像机边界 5 加上相机跟随和边界的效果 使用情景 Cinemachine是Unit
  • 【20230103】FROM_UNIXTIME和UNIX_TIMESTAMP函数

    首先知道UNIX TIMESTAMP函数的由来 是自 1970 01 01 的道当前时间的秒数差 累似1337276321 一般10位 1 FROM UNIXTIME 函数 FROM UNIXTIME unix timestamp form
  • python 2、python读取.htm文件报错:UnicodeDecodeError: 'utf8' codec can't decode byte 0xb3 in position 0的解决方法

    问题是这样的 我用python写的程序去读取 htm文件中的数据 刚开始我用 fr open 0 htm r 时 程序运行后直接崩溃 后来根据提示的错误信息 ValueError encoding must be one of utf 8
  • 不同文件格式与图像类型

    文件格式 通常有BMP 8 位 24 位 32 位 PNG JPG JPEG GIF PPM PNM 和 TIF 图像类型 单通道图像 每个像素由单个值表示 包括二值 单色 图像 每个像素由一个 0 1 位 和灰度图像 每个像素由 8 位表
  • Kotlin:Android世界的Swift

    转载自 http www infoq com cn news 2015 06 Android JVM JetBrains Kotlin Kotlin 是一门与 Swift 类似的静态类型 JVM 语言 由 JetBrains 设计开发并开源