kotlin会替代java_什么是Kotlin? Java替代说明

kotlin会替代java

Kotlin是一种通用,免费,开放源代码,静态类型的“实用”编程语言,最初是为JVM(Java虚拟机)和Android设计的,结合了面向对象和功能性编程功能。 它着重于互操作性,安全性,清晰度和工具支持。 针对许多处理器的针对JavaScript ES5.1和本机代码(使用LLVM)的Kotlin版本也在生产中。

Kotlin于2010年起源于IntelliJ IDEA背后的公司JetBrains,自2012年以来一直是开源的。Kotlin团队目前拥有来自JetBrains的90多名全职成员,而GitHub上Kotlin项目拥有300多个贡献者。 JetBrains在许多产品中都使用Kotlin,包括其旗舰产品IntelliJ IDEA。

[ 同样在InfoWorld上:11个标志说明您正在编写出色的代码 ]
将Java转换为Kotlin IDG

Kotlin作为更简洁的Java语言

乍一看,Kotlin看起来更像Java的简化版本。 考虑上面的屏幕截图,其中我已将Java代码示例 (左)自动转换为Kotlin。 注意,实例化Java变量固有的无意识重复已经消失了。 Java习惯用法

StringBuilder sb = new StringBuilder();

成为Kotlin

val sb = StringBuilder()

您可以看到函数是使用fun关键字定义的,并且当出现换行符时,分号现在是可选的。 val关键字声明一个只读属性或局部变量。 同样, var关键字声明一个可变属性或局部变量。

尽管如此,Kotlin还是强类型的。 仅当可以推断类型时,才可以使用valvar关键字。 否则,您需要声明类型。 每次发布Kotlin时,类型推断似乎都在改善。

查看两个窗格顶部附近的函数声明。 Java中的return类型在原型之前,但是在Kotlin中,它在原型之后,并在Pascal中用冒号分隔。

从这个例子中并不完全明显,但是Kotlin放宽了Java对函数必须是类成员的要求。 在Kotlin中,函数可以在文件的顶层声明,可以在其他函数内部局部声明,作为类或对象内部的成员函数以及扩展函数声明。 扩展功能提供了类似于C#的功能,可以使用新功能扩展类,而不必从类继承或使用任何类型的设计模式(例如Decorator)。

对于Groovy粉丝,Kotlin实施了建筑商; 实际上,可以对Kotlin构建器进行类型检查。 Kotlin支持委托属性,该属性可用于实现惰性属性,可观察属性,可否决属性和映射属性。

可以使用Kotlin协程将其他语言中可用的许多异步机制实现为库。 这包括来自C#和ECMAScript的async / await ,来自Go的通道和选择,以及来自C#和Python的generators / yield

Kotlin中的函数式编程

允许顶级功能只是Kotlin功能编程故事的开始。 该语言还支持高阶函数,匿名函数,lambda,内联函数,闭包,尾递归和泛型 。 换句话说,Kotlin具有功能语言的所有功能和优势。 例如,考虑以下实用的Kotlin习惯用法

在Kotlin中过滤列表

val positives = list.filter { x -> x > 0 }

对于更短的表达式,请在lambda函数中只有一个参数时使用it

val positives = list.filter { it > 0 }

遍历Kotlin的地图/成对清单

for ((k, v) in map) { println(“$k -> $v”) }

kv可以称为任何东西。

在Kotlin中使用范围

for (i in 1..100) { ... }  // closed range: includes 100
for (i in 1 until 100) { ... } // half-open range: does not include 100
for (x in 2..10 step 2) { ... }
for (x in 10 downTo 1) { ... }
if (x in 1..10) { ... }

上面的示例显示了for关键字以及范围的用法。

尽管Kotlin是成熟的功能编程语言,但它保留了Java的大多数面向对象性质作为替代编程风格,这在转换现有Java代码时非常方便。 Kotlin具有与构造函数,嵌套的,内部和匿名内部类放在一起,它有接口 ,如Java 8Kotlin没有一个new关键字。 要创建类实例,请像常规函数一样调用构造函数。 我们在上面的屏幕截图中看到了这一点。

Kotlin有来自一个名为超单继承,并且所有Kotlin类有一个默认的超类Any ,这是一样的的Java基础类java.lang.ObjectAny仅包含三个预定义的成员函数: equals()hashCode()toString()

Kotlin类必须用open关键字标记,以允许其他类从它们继承。 Java类则相反,因为它们是可继承的, 除非final关键字标记。 要覆盖超类方法,必须将方法本身标记为open ,并将子类方法标记为override 。 这与Kotlin的使事情变得明确而不是依赖默认值的哲学完全相同。 在这种特殊情况下,我可以看到Kotlin显式地将基类成员标记为对继承开放并且将派生类成员标记为重写的方式避免了几种常见的Java错误。

[ 同样在InfoWorld上:TypeScript与JavaScript:了解差异 ]

Kotlin的安全设施

谈到避免常见错误,Kotlin旨在消除空指针引用的危险并简化对空值的处理。 它通过将标准类型的null非法,添加可为null的类型以及实现快捷方式符号来处理null测试来实现此目的。

例如, String  类型的常规变量 String   不能为null

var a: String = "abc"
a = null // compilation error

如果需要允许空值(例如保存SQL查询结果),则可以通过在类型后附加问号来声明可空类型,例如String?

var b: String? ="abc"
b = null // ok

保护措施走得更远。 您可以使用不受惩罚的不可为null的类型,但是在使用它之前,必须先测试可为null的类型是否具有null值。

为了避免null测试通常需要的冗长语法,Kotlin引入了一个安全的调用 ,写成“ ?. 。 例如, b?.length   b?.length   如果b不为null ,则返回b.length ,否则返回null 。 此表达式的类型是Int?

换句话说, b?.lengthif (b != null) b.length else null的快捷方式。 该语法很好地链接在一起,消除了很多prolix逻辑,尤其是当从一系列数据库查询中填充对象时,其中任何一个都可能失败。 例如,如果Bob,部门和部门负责人都不为空,则bob?.department?.head?.name将返回Bob部门负责人的姓名。

要仅对非空值执行特定操作,可以使用安全调用运算符?.let一起:

val listWithNulls: List<String?> = listOf("A", null)
for (item in listWithNulls) {
      item?.let { println(it) } // prints A and ignores null }

通常,您通常想从可为空的表达式中返回有效但特殊的值,以便可以将其保存为不可为空的类型。 有一种特殊的语法称为Elvis运算符(我不告诉您),写成?:

val l = b?.length ?: -1

等于  

val l: Int = if (b != null) b.length else -1

同样,Kotlin省略了Java的检查异常,这些异常是必须捕获的可抛出条件。 例如,JDK签名

Appendable append(CharSequence csq) throws IOException;

要求您在每次调用append方法时都捕获IOException

try {
  log.append(message)
}
catch (IOException e) {
  // Do something with the exception
}

Java的设计师认为这是一个好主意,并且对于玩具程序来说是一个净赢,只要程序员在catch子句中实现了明智的选择即可。 但是,在大型Java程序中,这种情况常常会出现,在代码中,强制性catch子句只包含注释: //todo: handle this 。 这对任何人都无济于事,对于大型程序来说,检查异常是净损失。

Kotlin协程

Kotlin中的协程本质上是轻量级线程。 您可以在CoroutineScope的上下文中使用launchCoroutineScope器启动它们。 最有用的协程作用域之一是runBlocking{} ,它适用于其代码块的作用域。

import kotlinx.coroutines.*

fun main() = runBlocking { // this: CoroutineScope
    launch { // launch a new coroutine in the scope of runBlocking
        delay(1000L) // non-blocking delay for 1 second
        println("World!")
    }
    println("Hello,")
}

此代码产生以下输出,每行之间有一秒的延迟:

你好,
世界!

Android版Kotlin

直到2017年5月,唯一受官方支持的Android编程语言是Java和C ++。 Google在Google I / O 2017 上宣布了对AndroidKotlin的正式支持 ,并且从Android Studio 3.0开始, Android开发工具集中内置了Kotlin 。 Kotlin可以通过插件添加到早期版本的Android Studio中。

Kotlin编译为与Java相同的字节码,以自然方式与Java类互操作,并与Java共享其工具。 由于Kotlin与Java之间没有来回调用的开销,因此将Kotlin增量添加到当前使用Java的Android应用程序是很有意义的。 很少遇到Kotlin和Java代码之间缺乏互操作性的情况,例如Java set-only属性,这种情况很少遇到并且很容易解决。

早在2016年11月, Pinterest就是用Kotlin编写的Android应用程序的典型代表,而在Kotlin公告中, Pinterest在Google I / O 2017上被提及。 此外,Kotlin团队喜欢引用适用于Android的Evernote,Trello,Square和Coursera应用程序。

[ 同样在InfoWorld上:如何将测试自动化与敏捷和devop结合使用 ]

Kotlin与Java

自Google I / O宣布以来,Android社区中已经出现了很多问题,即选择Kotlin还是Java进行新开发,尽管人们已经在2016年2月Kotlin 1.0发行时提出了这个问题。 简短的答案是Kotlin代码比Java代码更安全,更简洁,并且Kotlin和Java文件可以共存于Android应用程序中,因此Kotlin不仅对新应用程序有用,而且对扩展现有Java应用程序也很有用。

我看到选择Kotlin而非Java的唯一令人信服的论点是针对完整的Android开发新手。 对于他们来说,考虑到历史上大多数Android文档和示例都使用Java的情况,可能有一个超越的障碍。 另一方面,在Android Studio中将Java转换为Kotlin只是将Java代码粘贴到Kotlin文件中的简单问题。

对于几乎所有其他进行Android开发的人来说,Kotlin的优势都是引人注目的。 Java开发人员学习Kotlin的典型时间是几个小时,这是消除空引用错误,启用扩展功能,支持函数式编程以及添加协程的小笔费用。 典型的粗略估算表明,从Java到Kotlin的代码行数减少了大约40%。

[ 也在InfoWorld上:Devops最佳实践:应该采用的5种方法 ]

翻译自: https://www.infoworld.com/article/3224868/what-is-kotlin-the-java-alternative-explained.html

kotlin会替代java

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值