Kotlin对Java的优势:

一、编译时判空机制

Kotlin在编译时会对可能会导致空指针异常的地方进行了强制判断,帮助我们规避掉绝大多数的空指针异常。主要体现在我们在声明变量或者参数的时候就必须显示给定这个变量或参数是否可以为空。例如:

class User {

fun sayHello(who: String) {

println(“Hello $who”)

}

}

var user : User? = null //声明一个可以为空的user变量

在声明user变量的时候,通过在User类型后面加**”?“**来表示这个user对象是可能为空的,如果我们在使用user的时候不进行判空操作,编译器将直接抛出异常。

user.sayHello(“Mark”) //直接使用user对象无法编译通过

错误如下:

Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type User?

要想使用可能为空的对象,有一下两种方案:

user?.sayHello(“Mark”) //对象后面加”?“,表示如果user对象不为空,才会执行后面的sayHello方法

//或者

user!!.sayHello(“Mark”) //强行认定user不为空,当user为空时会抛出NullPointException

如果我们在声明变量或参数的时候,在类型后面不加**“?”**,则表示这个对象不允许为空,变量的声明如下:

var user : User = User() // 由于user不能为空,我们无法给user赋值为null

//或者

lateinit var user : User // 先声明出user,延迟对user进行初始化操作

注意:如果使用lateinit延迟对象的初始化的话,在使用这个对象的时候要确保先对其进行初始化操作,否则会抛出异常:

kotlin.UninitializedPropertyAccessException:lateinit property user has not been initialized

以上是变量中的空判断,作为参数的时候也是一样的道理:

fun somebody1(user : User?){} // 允许传入的参数user为空

fun somebody2(user : User){} // 不允许传入的参数user为空

切记,在Kotlin中User和User?是两个不相同的类型,因此在somebody2中传入User?类型的参数的话,是无法编译通过的。也正是因为这样,开发过程中存在的空指针隐患能在编译阶段被暴露出来,能帮助我们规避绝大多数的NullPointException。

以上就是Kotlin在规避空指针方面的应用。

小伙伴:就这?我多加几个if(user != null)的判断不也一样,为啥还要学一门新的语言?

打工人:别急,Kotlin的特性远远不止如此,且听我慢慢道来。

二、可选参数与具名参数

重载是我们开发过程经常见到,以前用Java的时候是如何进行方法的重载呢?

public void sayHello(String name){

sayHello(name,null,null,null)

}

public void sayHello(String name,Integer age){

sayHello(name,age,null,null)

}

public void sayHello(String name,Integer age,Integer tall){

sayHello(name,age,tall,null)

}

public void sayHello(String name,Integer age,Integer tall,String interest){

//balabala

}

上面是比较常见的重载,但是如果再想要重载一个只要name和tall参数的方法,怎么重载?

image.png

Kotlin的方法重载比Java要简洁许多:

//给age、tall、interest分别

fun sayHello(name:String,age:Int? = null,tall:Int? = null,interest:String? = null){

//balabala

}

这一个方法变实现了上面四个方法的功能,并且还一不小心做了增强。再出现上面那个只要name和tall的尴尬问题,只需要使用具名调用的方式就可以了。

sayHello(“Mark”,18,180,“大宝剑”) //传入了所有参数

sayHello(“Mark”,18) // 传入了name和age

sayHello(“Mark”,age = 18) //同上,显示的指定了age参数

sayHello(“Mark”,tall = 180) //传入了name和tall

sayHello(“Mark”,interest = “大宝剑”) //直接大宝剑也是可以的

是不是既满足了Java重载的多个方法的功能,又增强了不少?

但有一点需要注意:如果传入的可选参数是连续的,Kotlin可以推演出参数的类型,对号入座,但如果不连续,就需要用具名参数的方式指明要传入哪个参数。

同样和作用于构造方法的重载。

三、函数作为参数或返回值

虽然说JDK 1.8的时候,也支持了把函数作为参数传递的特性,但是却很少在项目中有见到过这么用的,具体是什么原因我也不太清楚,猜测是Java语言给开发者们留下的旧有印象吧。Java的实现这里就不做讨论了,重点介绍一下再Kotlin中是如何使用这一特性的。

我们现在实现一个最简单的函数参数方法,再讨论使用场景。

fun launch(block : () -> Unit){

//do something

}

在上面的代码中,我们定义了一个名为launch的方法,而这个方法的参数是一个无参无返回值的函数,在调用方法的时候传入具体的函数。

如果这个函数参数是定义方法的最后一个参数,函数体可以写到括号表达式外部,如果括号表达式里面没有参数,则可以省略括号表达式,所以可以用如下形式调用launch方法:

launch{

// 这是函数参数里面的具体实现

}

可能看起来有点抽象,我们可以描述一个需求,然后再实现这个需求,理解起来就更清楚一些。

需求:

A、B两人分别负责各自的运算逻辑对m和n两个数据进行处理,但是处理的最终结果需要在show方法里面展示出来,我们当然可以用if else的逻辑实现这个show方法,伪代码如下:

fun show(m,n){

int v = if(A){//如果是A处理,返回m+n

m+n

} else if(B){//如果是B处理,返回m-n

m-n

}

showIt(v) //对结果进行最终处理

}

这样的写法虽然可以满足功能,但是如果有十几个人都要实现自己的逻辑呢?程序将进入if else的地狱。还有,如果show方法是在基础模块中定义,A和B又都是业务模块,把业务模块中的逻辑沉淀到基础模块是不合理的,在Java中遇到这种需求通常就要考虑面向对象了,基础模块中抽象出接口,A、B中对接口做实现,但这样的实现未免太复杂,我们是不是可以这么写呢:

//基础模块 block函数需要两个Int类型参数并返回值为Int类型

fun show(m:Int,n:Int,block : (m :Int, n:Int) -> Int){

showIt(block(m,n))

}

//A 的模块

var blockA = fun (m :Int, n:Int){

return m+n

}

show(m,n,blockA) //A 的模块调用基础模块的show方法

//B 的模块

var blockB = fun (m :Int, n:Int){

return m-n

}

show(m,n,blockB) //B 的模块调用基础模块的show方法

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
img

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

三、全套PDF电子书

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

四、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

五、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

六、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐