为什么80%的码农都做不了架构师?>>>   

kotlin作为一个现代的适用于多平台的静态类型语言越来越受到java开发同学的喜爱,尤其是android开发同学的喜爱,下面从几个方面浅析一下kotlin和java的一些比较。

Optionals:

在java开发中我们经常会遇到一个异常,就是NPE,也就是所谓的nullPointerException,这个异常号称java最大的bug一直让我们java开发非常头疼,大量的if判断后者try cache捕获异常让我们的代码变得很不优雅,但是在kotlin中已经完美的解决了该问题,只需一个问号:?。新接触kotlin的同学获取对该语言中的?有太多的疑惑,所以不敢使用问号,下面简单说一下:

在kolin中,一切都是对象,所有的变量和常量必须有初始值,而且kotlin中没有基本数据类型,全是引用数据类型,也就是说所用的变量都用可能为null,所以当你为一个变量初始化时,一定要有一个初始值,但是你的初始值一旦为null:

你的IDE一定会提示你报错,那正确的写法应该是:

那么该变量i就有可能为null.然后看下面的语句:

var map : HashMap<String,Any> ? = null
//var empty = map!!.isEmpty()
var empty = map?.isEmpty()
//var empty = map?.isEmpty()?:false

首先定义了一个HashMap,初始化为null,这个时候用map调用isEmpty()方法肯定会报错的,这个时候有两种解决办法,第一让它抛出异常,用!!表示,第二用?,表示我知道它有可能为null,但是还是要执行sEmpty()方法,大不了返回值empty也为null,第四条语句为,如果map?.isEmpty()为null,则为empty赋值为false,这就是Elvis表达式。

Stream和Lambdas表达式

java从jdk8开始引入了stream和lambdas表达式,但是开发者这种特性或者说语法糖一直不感冒,当年尤记得我在java代码中使用stream对collection的filter操作后,技术总监对我严厉的批评,说明java和java开发者都是相对保守的。再者在android开发中,虽然在Java 8和9中可以使用stream和lambdas,但在API 24以下的Android SDK中是不可用的,那也只能意味着放弃,但kotlin的出现让这些语法糖冲新在android中得到了发挥。

请看下面三行代码:

var array = arrayListOf(1,2,3,4,5,5,6,7,8,9,0,-1)
var subArray = array.filter ({ item -> item > 0 })
var subArray2 = array.map { it + 10 }

首先定义了一个变量array,类型为ArrayList<Int>,并add了一组数据,这个时候我想要对这个集合做一些操作,比如说筛选,那么在java中最常用的就是for循环或while循环遍历,但是如果使用stream和lambdas表达式就是一行代码搞定,也就是上面的第二行语句。

首先说一下何为stream,其实就是对元素集合统一、快速、并行操作的一种方式,何为lambdas表达式:其实就是一个匿名函数,支持函数式编程,有自己独特的语法糖格式。

然后再看看array.filter()的源码:

/*** Returns a list containing only elements matching the given [predicate].*/
public inline fun <T> Iterable<T>.filter(predicate: (T) -> Boolean): List<T> {return filterTo(ArrayList<T>(), predicate)
}

灰常简单,首先参数为一个匿名函数(匿名函数中有一个参数T,返回值为布尔类型),返回值为List<T>。

在看android中的一段代码:

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)val text = findViewById(R.id.text) as TextViewtext.setOnClickListener { v ->Toast.makeText(this@MainActivity, "Hello", Toast.LENGTH_LONG).show()v.visibility = View.VISIBLE}}
}

当为text设置一个监听时,我们习惯的写法是写一个匿名内部类,但是在kotlin可以用lambdas表达式代替,但是只限于监听接口只有一个方法实现。

Binding of views

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

构造器

在java中constructor相对kotlin比较灵活,在kotlin中,定义一个class时,也会有一个默认的构造器,当你自定一个构造器时可以分为主构造器和二级构造器:

class Test constructor(name : String){var name : String ? = nullvar age : Int ? = nullconstructor(age : Int,name : String) : this(name)init {this.name = namethis.age = age}
}

但是,如果类有主构造函数,每个二级构造函数都要,或直接或间接通过另一个二级构造函数代理主构造函数。在同一个类中代理另一个构造函数使用this 关键字,如上面的代码。

上面的几点是我决得比较有意思的,并在实际开发中会经常的使用,java和kotlin当然还有大量的差异,比如java中的static、this关键字在kotlin中如何实现,java中的.class在kotlin中如何表示等等,这些都需要我们在实际开发中慢慢了解和习惯。

转载于:https://my.oschina.net/gef/blog/1582071

kotlin与java对比相关推荐

  1. Kotlin极简教程:第10章 Kotlin与Java互操作

    Kotlin is 100% interoperable with Java™ and Android™ 在前面的章节中,我们已经学习了Kotlin的基础语法.类型系统.泛型与集合类.面向对象与函数式 ...

  2. Kotlin与Java语法对比总结

    文章目录 前言 一.变量 二.函数 三.程序的逻辑控制 1.条件语句 2.循环语句 四.面向对象编程 1.类与对象 2.继承 3.构造函数 4.接口 5.数据类与单例类 五.Lambda编程 1.集合 ...

  3. 《From Java To Kotlin》-Kotlin与Java的简单对比

    前言: 原文来自https://github.com/MindorksOpenSource/from-java-to-kotlin 本文也只是简单比较kotlin与java的不同之处,实际学习kotl ...

  4. 入门 Kotlin 和 Java 混合开发

    一.前沿 如果你学习过其他的编程语言,你就会发现 Java 的语法很是哆嗦,可是我们为什么没有放弃 Java 这门编程语言呢?因为 JVM 是一个非常好的平台,而且 Java 程序员目前在中国所占的比 ...

  5. java:数字转string 报空指针_超干货详解:kotlin(4) java转kotlin潜规则

    前言 以一个java老鸟的角度,如何去看 kotlin. Java源代码应该如何用Kotlin重构. 如何正确学习kotlin并且应用到实际开发中.本文将会探究. 本文分两大块,重难点和潜规则. 重难 ...

  6. java 可选参数_超干货详解:kotlin(4) java转kotlin潜规则

    往期推荐 如果面试时大家都说真话... 这400道面试题,决定了你去BAT还是TMD 前言 以一个java老鸟的角度,如何去看 kotlin. Java源代码应该如何用Kotlin重构. 如何正确学习 ...

  7. Kotlin学习笔记 第四章Kotlin调用Java

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  8. 开发Android应用用Kotlin还是Java?

    还记得多年前有关Android与iOS孰优孰劣的辩论吗?如今,Kotlin与Java的争论,时常广泛地发生在开发人员之中.不过,由于大家往往关注的是Java所不具备的Kotlin功能,因此他们的结论可 ...

  9. 【Kotlin】apply 内联扩展函数 ( apply 函数原型 | apply 函数示例 | Kotlin 调用 Java API )

    文章目录 I . 内联扩展函数 apply II . Kotlin 调用 Java API III . apply 内联扩展函数示例 ( 调用 Java API 处理图像 ) I . 内联扩展函数 a ...

最新文章

  1. 你哪来这么多事(四):职工信息排序
  2. 世界被一种神秘的数学力量彻底改变了
  3. HDU4472 Count
  4. Meta AI推出“杂食者”:一个模型搞定图像、视频和3D数据三大分类任务,性能还不输独立模型...
  5. Python中的高效的集合操作
  6. 内存泄漏和内存溢出的优化
  7. php.amazeui,AmazeUI 导航条的实现示例
  8. matlab图片白边_Matlab论文插图消除白边的5种方法
  9. 喜欢去知乎炸鱼?用python吧
  10. android 代码 lut,Android BitmapFactory.decodeResource()错误或用于加载大LUT的替代选项...
  11. 编程语言对比 函数定义
  12. log4j 新建日志 重启_Java中log4j控制写入日志开关
  13. SQL查询-将列转换成字符串(for xml path)
  14. 阿里巴巴Android开发手册V1.0.0随手笔记
  15. libevent源码深度剖析二
  16. 决策树模型(R语言)
  17. HTML 表单 (form) 的作用解释
  18. vue ant design a-table表格标题(title)添加icon样式
  19. react ant-design自定义图标
  20. 2022年宋干节活动-乌隆他尼皇家大学

热门文章

  1. Algorithm Gossip (22) 中序式转后序式(前序式)
  2. (AIDE)Android Eclipse JNI 调用 .so文件加载问题
  3. Operating System-进程/线程内部通信-信号量和PV操作
  4. FirstApp,iphone开发学习总结7,相机
  5. Linux-鸟菜-5-目录配置-FHS
  6. UVA11722(见面概率)
  7. poj2112 二分最大流+Floyd
  8. 【C 语言】结构体 ( 结构体变量内存操作 | 通过 “ . “ 操作符操作结构体内存空间 | 通过 “ -> “ 操作符操作结构体内存空间 )
  9. 【运筹学】运输规划 ( 运输规划问题模型及变化 | 表上作业法引入 )
  10. 1003 Dijkstra算法