不服来战,看Kotlin如何完爆Java

前言:Kotlin因支持谷歌和简化Android开发而声名鹊起。看看它如何解决Java的许多痛点。

Why Kotlin?

如果我今天被问到如何区别开发Android应用程序与其他领域开发时,我会毫不犹豫地回答,以原生方式在不同硬件上执行相同应用程序可能会是其中原因之一;但…这怎么可能?我想我还是通过解释Kotlin语言的好处来开始我的这篇文章吧。

在这一点上,没有人惊讶地看到相同的web应用程序运行于任何设备,任何平台(Android、iOS、 Windows、MacOS…)。我们都知道这些应用程序比任何本地应用程序都更慢,也更不稳定,但是优点是,我们只需要为所有平台开发一个应用程序。Java的强悍之处在于如今它已经应用于数十亿的设备上,无论其硬件和软件如何,只要它有一个Java编译器生成的pseudo-compiled解释器。

但是,这是否意味着Java是完美的解决方案?不幸的是,事实并非如此。尽管Java解决了设备之间的互操作性问题,但它带来了一系列新的问题,以下便是其中一些:

注意:这些问题虽然在Java 8和9中得到了解决,但在API 24以下的Android SDK中是不可用的,这使得它们实际上无法使用。

对于optionals没有本地支持。虽然有Optional 类,但它的使用意味着生成大量的样板代码,如果对选项的支持是在语言本身内构建的,而不是扩展的,我们可以保存这些代码。

对于函数式编程,没有本地的支持:在Java中,有Stream API (再说一次,它只支持从API 24开始的Android),但是它在语言中的集成类似于Optional;它不存在于与原始类型相关联的对象中(IntStream,DoubleStream…),并且通过一个Stream class 提供给所有其他对象。

支持匿名函数(Lambdas)。尽管Java 8包含了对Lambda函数的支持,但这些都不是一级公民;这意味着,尽管我们可以使用lambdas以单个方法实现匿名接口,但Java不支持将函数作为参数传递给方法。另外,由于在语言中缺乏对它们的支持,类型推断的缺失使得Lambdas的语句非常不舒服,特别是在试图模拟函数比如函数组合或局部套用时。

Type nullability:虽然这可以包含在可选的部分中,但是这个问题的维度应该特别提到。有多少Java程序员试图通过if (foo! = Null)与可怕的NullPointerException斗争,而没有填满他们的代码?(事实上,它的创建者应该为他所说的“十亿美元的错误”道歉),而这些检查中有多少是为了避免在我们的应用程序中出现崩溃而做出的补丁呢?

Binding of manual views:尽管这个问题是针对Android平台的,而不是针对Java的,但它也需要样板代码,以获得对Android视图的引用。尽管我们已经通过dataBinding成功地消除了不受欢迎的findViewById(int id),但我们仍然需要存储对该绑定的引用。

为什么Kotlin 会打破这一切

Java是一种非常冗长的语言,它需要为任何操作编写大量的代码,并生成大量的文件(每个类一个)。第一个问题可能会导致我们代码的维护成本更高,更容易出现错误。第二个问题是 class proliferation问题。

正是由于这些原因,今天,Java被认为至少在Android开发中,并没有以行业的速度发展。随着时间的流逝,需要有一种现实和原生支持的语言来解决所有上面提到的问题变得越来越必要,这种语言需要同时拥有我在本文开头提到的主要特点:编写和编译一个应用程序,使它可以运行在任何设备和版本上。

在这个方向上,许多可能性已经被探索,其中一些是使用Swift或Scala,尽管没有一个是非常有希望的。所有这些都随着Kotlin语言的出现而改变。Kotlin是由Jetbrains设计和开发的一种语言,这种语言还在不断的进化中,最重要的是,它可以在JVM上执行。这使它成为Android应用的完美候选者。

为了证明这一点,我们可以列出在面对Java的所有缺点时,Kotlin表现出的优势:

Optionals:他们被构建在Kotlin;你所要做的就是声明一个变量的类型以问号结尾,这样它就变成了optional的类型。Kotlin还提供了安全打开那些optionals listener ?.onSuccess() 的可能性,而无需检查optional有没有值,并且还提供了Elvis Operator。

函数式编程:在Kotlin中,我们找到了本地支持来处理像Streams这样的集合和数据集。我们可以在一个collection中直接调用 .flatMap {}或者.filter {}、.map {}等等。类型的推断使得使用Lambdas变得特别容易。

Lambdas和高阶函数:在Kotlin中,函数是一级公民的事实已经完成。我们可以定义接收其他函数作为参数的函数。一个例子是map函数本身的定义:

虽然乍一看,这段代码看起来有点混乱,我们感兴趣的部分是transform:(T)- > R .这意味着map函数有一个参数transform,这本身就是一个函数,它有一个T类型的输入参数,并返回一个对象类型的R。

由于本地对lambdas的支持,在Kotlin中,我们可以使用map函数:

inline fun <T, R> Iterable.map(transform: (T) -> R): List (source)

此代码片段将返回由aTransformation生成返回类型的元素集合。

collection.map { item -> aTransformation(item) }

Type nullability:在Kotlin中,由于有对optionals的集成支持,我们的代码中应该有最小可能的nullables。但即便如此,Kotlin还是提供了比Java更容易处理的工具。例如,我们有safe call (?) 来避免NullPointerException,或者在我们想要执行转换时使用操作符安全的cast来保护我们。另外,Kotlin的编译器强制控制可能具有空值的类型,甚至在与Java代码兼容的情况下引入运行时检查。

Binding of views:这是一个具体的Android问题,Jetbrains为我们提供了Kotlin Android扩展;一个官方的支持库通过一个gradle的插件来简化这个问题(以及其他一些问题)。

Java:

public interface Listener {void success(int result);void error(Exception ex);
}
public void someMethod(Listener listener) {int rand = new Random().nextInt();if(listener != null) {if (rand <= 0) {listener.onError(new ValueNotSupportedException());}else {listener.success(rand);}}public void fun(Type1 param1) {param1.someMethod(new Listener() {@Overridepublic void success(int result) {println(“Success” + result);}@Overridepublic void error(Exception ex) {ex.printStackTrace();}}
}

Kotlin:

fun someMethod(success: (Int) -> Unit, error: (Exception) -> Unit) {val rand = Random().nextInt()if (rand <= 0) {error(ValueNotSupportedException())else {success(rand)}}
}
fun (param1: Type1) {param1.someMethod( {println(“Success” + it);}, {it.printStackTrace();})
}

甚至使用表达式:

fun someMethod(success: (Int) -> Unit, error: (Exception) -> Unit) {val rand = Random().nextInt()if (rand <= 0) error(ValueNotSupportedException()) else success(rand)
}
fun (param1: Type1) {param1.someMethod( {println(“Success” + it);}, {it.printStackTrace();})
}

现在,读者应该很清楚,哪一个片段更容易编写和解释。

以上,我们所讨论的,以及许多其它的功能,都在不断的证明,Kotlin似乎是未来几年移动开发领域最有希望的赢家。

原文链接:Why Kotlin Language, Android? Why Did Google Choose Kotlin?(责编/魏伟)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/525741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法代码中的循环矩阵在哪体现_「Machine Learning 学习小结」| 向量在梯度下降算法当中的应用...

写在前面&#xff1a;在之前的文章当中提到过&#xff0c;学习梯度下降算法&#xff0c;可能需要一点点线性代数的知识。在本篇文章当中&#xff0c;我们的讨论就涉及到了向量。笔者也曾提到&#xff0c;不妨把向量看成对数据进行批量操作的一种工具&#xff0c;这样可能对我们…

计算机用户 图片存储位置,手机相册在哪个文件夹,详细教您手机图片存放在哪里...

现在使用手机的用户是越来越多了&#xff0c;手机质量都非常好&#xff0c;因此才会受到许多人的褒奖。不过有用户却遇到了&#xff0c;用手机拍摄了照片或者用手机截图&#xff0c;手机连上电脑后&#xff0c;却在电脑上找不到图片&#xff0c;怎么办&#xff0c;下面&#xf…

揭秘京东文件系统JFS的前世今生,支持双11每秒约10万个对象同时读写

背景 作为一家大规模的自营式电商企业&#xff0c;京东需要存储海量的非结构化数据&#xff1a;商品图片、订单文本、仓库流转记录、App客户端文件、日志文件、内部文档等。对于存储这些数据&#xff0c;之前并没有统一的解决方案&#xff0c;都是各个业务线自行解决——MySQL …

计算机的复数英语怎么读,英语的复数怎么读

目录1.土豆的复数英语怎么读1.英语中的月份的复数 怎么读 读音&#xff1f; months 最后两个辅音&#xff0c;是否可以省略一个。2.在清辅音后&#xff0c;读/s/,如books, 在浊辅音和元音后&#xff0c;读/z/&#xff0c;如dogs,boys 当然。3.名词复数词尾的读音&#xff1a;1)…

java map清除值为null的元素_Java中的集合框架大总结

直接上图&#xff1a;从上面的集合框架图可以看到&#xff1a;Java集合框架主要包括两种类型的容器&#xff0c;一种是集合(Collection)&#xff0c;存储一个元素集合&#xff1b;另一种是图(Map)&#xff0c;存储键/值对映射。Collection接口又有两个子接口&#xff0c;List和…

土木转计算机 但计算机学院不好,土木妹子转计算机,较高三维水科研,求指导!...

2016-12-15velvetvalley个人情况当前阶段大四本科院校某中流985&#xff0c;top30本科专业土木&#xff0c;辅修计算机GPA土木91.6/100,10/111&#xff1b;计算机88.4/100,1/23GRE/GMAT3284语言成绩109目标专业计算机科学计划留学年份:2017秋季个人背景:一个水国创&#xff0c;…

十位值得关注的Java顶级专家

网上有太多的声称Java大牛的大V&#xff0c;到底哪些值得关注&#xff0c;本文也许可以帮助你。 如果你是Java开发者&#xff0c;关注几位经验丰富的Java大牛&#xff0c;并随时了解他们的关注焦点对于自己肯定是非常有好处的。然而&#xff0c;今天在网络上&#xff0c;有太多…

关于计算机软件系统分类能够匹配的有,以下关于计算机软件系统分类能够匹配的有:...

摘要&#xff1a;关于够匹比低高强钢筋筋的极限度钢大强度应变拉伸。统分变异系数主观权是一种法赋赋权法。关于够匹对第的说确的物流法正三方是(。...关于够匹比低高强钢筋筋的极限度钢大强度应变拉伸。最大区边压应缘力在受压&#xff0c;计算机软件系破坏截面梁正适筋受弯时…

开关 关闭_无论用什么品牌手机,这个开关要关闭,以免耗电又卡顿,抓紧试试...

各位观众老爷大家好&#xff0c;给大家鞠个躬&#xff0c;每天给大家分享实用的生活小妙招。现在我们的工作生活中已经离不开手机&#xff0c;平时用久了手机卡顿不流畅&#xff0c;耗电也会随之增加&#xff0c;其实有可能是没有把这几个开关关闭&#xff0c;今天和大家分享一…

卷积神经网络中十大拍案叫绝的操作

来源 | 知乎作者 | Professor hoCNN从2012年的AlexNet发展至今&#xff0c;科学家们发明出各种各样的CNN模型&#xff0c;一个比一个深&#xff0c;一个比一个准确&#xff0c;一个比一个轻量。我下面会对近几年一些具有变革性的工作进行简单盘点&#xff0c;从这些充满革新性的…

事业单位计算机初级考试科目一模拟试题,广东教师资格考试之科目一模拟题

教师资格考试的竞争越来越激烈&#xff0c;为了能够在考试中脱颖而出少不了平日里的练习积累!那就让我们一起开始练习吧!1.某学生家长给张老师发微信红包&#xff0c;想让张老师平日里对自家孩子多多费心&#xff0c;张老师拒绝了。张老师的做法( )。A.不正确&#xff0c;无法取…

提高代码可读性的10个技巧

在本文中&#xff0c;作者从注释&#xff0c;缩进&#xff0c;代码分组&#xff0c;命名方式等方面&#xff0c;介绍了10个提高代码可读性的技巧&#xff0c;供读者学习和借鉴。 以下为译文&#xff1a;如果你的代码很容易阅读&#xff0c;这也会帮助你调试自己的程序&#xff…

内蒙古一级计算机考试时间2015,2017年内蒙古计算机一级考试报名时间

2017年内蒙古计算机一级考试报名时间一级分为DOS版和Windows版&#xff0c;考核应试者计算机基本知识和使用微机系统的初步能力&#xff0c;那么&#xff0c;2017年内蒙古计算机一级考试报名时间是什么时候&#xff1f;一起来看看&#xff1a;2017年内蒙古计算机一级考试报名时…

去掉数组最后一个元素_leetcode 34. 在排序数组中查找元素的第一个和最后一个位置每天刷一道leetcode算法系列!...

作者&#xff1a;reed&#xff0c;一个热爱技术的斜杠青年&#xff0c;程序员面试联合创始人前文回顾&#xff1a;leetcode1. 两数之和--每天刷一道leetcode系列&#xff01;leetcode2. 两数相加--每天刷一道leetcode系列&#xff01;leetcode3. 无重复字符的最长子串--每天刷一…

6个月清洗近千亿条微信支付交易记录,他们要搞什么大事情?

本文转载自腾讯技术工程官方号背景&#xff1a;2013年8月&#xff0c;微信红包上线。2014年春节微信红包引爆社交支付。2015年春晚红包摇一摇&#xff0c;推动微信红包在全国迅速普及。此后&#xff0c;每逢节假日或特殊日子&#xff0c;人们都会自主的兴起发红包&#xff0c;使…

计算机原理 信息化教学设计,小学数学信息化教学设计

一、信息化教学设计的理论基础现在&#xff0c;建构主义倡导的“发现式教学”成为一种重要的教学策略&#xff0c;但笔者认识并不是所有的教学内容都适合于运用发现式教学&#xff0c;奥苏贝尔的“接受式”教学仍然是一种最经济、便捷和有效的教学方式。它既是对现代教学的一种…

右下角文字如何写_如何提取任意小程序的小程序路径

这几天我在写关于公众号和小程序互通的文章&#xff0c;在公众号跳转小程序的设置中有一个信息绕不过去&#xff0c;那就是小程序路径&#xff0c;对于非开发人员&#xff0c;如何轻松获取小程序路径是本文所讲述的内容本文内容本文通过具体截图文字描述&#xff0c;获取某个小…

基于Docker持续交付平台建设的实践

导读&#xff1a;中国五矿和阿里巴巴联手打造的钢铁服务专业平台五阿哥&#xff0c;通过集结阿里巴巴在大数据、电商平台和互联网产品技术上的优势&#xff0c;为终端用户带来一站式采购体验。本文是五阿哥运维技术团队针对Docker容器技术在如何在持续交付过程中探索和实践&…

计算机课件比赛总结,课件制作比赛活动总结

【www.gz85.com - 投篮比赛活动工作总结】课件制作比赛&#xff0c;是对计算机多媒体等辅助手段的一次检阅&#xff0c;也有力地促进了制作多媒体课件技艺的提高。下面是小编为您整理的“课件制作比赛活动总结”&#xff0c;仅供参考&#xff0c;希望您喜欢&#xff01;更多详细…

设置pandas显示行数_Pandas这样来设置,做数据分析舒适百倍

在日常使用pandas的过程中&#xff0c;由于我们所分析的数据表规模、格式上的差异&#xff0c;使得同样的函数或方法作用在不同数据上的效果存在差异。而pandas有着自己的一套「参数设置系统」&#xff0c;可以帮助我们在遇到不同的数据时灵活调节从而达到最好的效果&#xff0…