美文网首页
Kotlin-基础语法

Kotlin-基础语法

作者: AndYMJ | 来源:发表于2021-07-03 14:10 被阅读0次

在明白kotlin的设计哲学之后,你可能迫不及待的想要了解它的具体语言特性了。本章我们会介绍kotlin中最基础的语法和特点,包括:

1.程序中最基本的操作,如申明变量、定义函数以及字符串操作;

2.高阶函数的概念,以及函数作为参数和返回值的作用;

3.lambda表达式语法,以及用它来简化程序表达;

4.表达式在kotlin中的特殊设计,以及if,when,try等表达式的用法。

由于这是一门旨在成为更好的java而被设计出来的语言,我们会在介绍它的某些特性的同时,与java中相似的语法进行对比,这样可以让你更好的认识kotlin。好了,我们现在就开始吧。

2.1 不一样的类型申明

当你学习kotlin时,可能第一个感受到与众不同的语法就是申明变量了。在java中我们会把类名放在变量名的前面,比如来申明一个变量。

string a = “I am java”;

kotlin采用的则是不同的做法,与java相反,类型名通常在变量名的后面。

val a:string =“I am koltlin”

为什么要采用这种风格啦?以下是kotlin官方FAQ的回答

-----------------------------------------

我们相信这样可以使得代码的可读性更好。同时,这也有利于使用一些良好的语法特性,比如省略类型申明。Scala的经验表明,这不是一个错误的选择。

-----------------------------------------

很好,我们发现kotlin确实在简介、优雅的语法表达这一目标上表现得言行一致。同时你也可能注意到了关于“省略类型申明”的描述,这是什么意思啦?

2.1.1 增强的类型推断

类型推导是kotlin基础上增强的语言特性之一。通俗地理解,编译器可以在不显式声明类型的情况下,自动推导出它所需要的类型。我们来写几个例子:

val string = "I am Kotlin"

val int = 1314

val float = 1314f

val double = 13.14

val double2 = 10.1e6

然后在REPL中打印以上变量的类型,如println(string.javaClass.name),获得的结果如下:

java.lang.String

int

long

float

double

double

类型推导的很大程度上提高了Kotlin这种静态类型语言开发的效率。虽然静态类型的语言有很多的优点,然而在编码过程中却需要书写大量的类型。类型推导则可帮助Kotlin改善这一情况。当我们用kotlin编写代码时,IDE还会基于类型推导提供更多的提示信息。

在本书接下来展示的Kotlin代码中,你经常感受到类型推导的魅力。

2.1.2 声名函数返回值类型

虽然Kotlin在很大程度上支持了类型推导,但这并不意味着我们就可以不声明函数的返回值类型了。先来看看Kotlin如何用fun关键字定义一个函数:

与声明变量一样,类型信息放在函数名的后面。现在我们把返回类型声明去掉试试:

以上的例子中,因为没有声明返回值的类型,函数默认被当成返回Unit类型,然而实际上返回的是Int,所以编译就会报错。这种情况下我们必须显式声明返回值类型。

---------------------------------------------

由于一些语言如Java没有Unit类型,你可能不是很熟。不要紧,当前你可以暂时把它当作类似Java中的void。不过它们显然是不同的,Unit是一个类型,而void只是一个关键字,我们在2.4.2节进一步比较两者。

---------------------------------------

也许你会说,Kotlin看起来并没有比java强多少嘛,Java也支持某种程度上的类型推导,比如Java7已经支持范型上的类型推导,Java 10则进一步支持了“局部变量”的类型推导。

其实,Kotlin进一步增强了函数语法,我们可以把{}去掉,用等号来定义一个函数。

fun sum(x:Int,y:Int)= x+y // 省略了{}

》〉》〉》sun(1,2)

3

Kotlin支持这种用单行表达式与等号的语法来定义函数,叫做 表达式函体 ,作为区分,普通的函数声明则可叫做 代码块函数体 。 如你所见,在使用表达式函数体的情况下我们可以不声明返回值类型,这一进步简化了语法。但别高兴的太早,再来一段递归程序试试看:

你可能觉察到了if在这里不同寻常的用法---》没有return关键值。在Kotlin中if是一个表达式,它的返回值是各个逻辑分支的相同类型或公共父类型

----------------------------------

表达式在Kotlin中占据了非常重要的地位,我们会在2.4节重点介绍这一特性。

----------------------------------

我们发现,当前编译器并不能针对递归函数的情况推导类型。由于像Kotlin、Salca这类型语言支持子类型和继承,这导致类型系统很难做到所谓的 全局类型推导

---------------------

关于全局类型推导,纯函数语言Haskell是一个典型的代表,它可以在以上的情况下依旧推导出类型,

---------------------

所以,我们在一些诸如递归的复杂情况下,即使用用表达式定义函数,我们也必须显式声明类型,才能让程序正常工作

此外,如果这是一个表达式定义的接口方法,显式声明类型虽然不是必需的,但可以在很大程度上提升代码的可读性。

-------------

总结:

我们可以根据以下问题的提示,来判断是否需要显式声明类型:

1.如果它是一个函数的参数     必须使用

2如果它是一个非表示式定义的函数。除了返回Unit,其他情况必须使用,

3如果它是一个递归函数      必须使用

4 如果它是一个公有方法的返回值。 为了更好的代码可读性及输出类型的可控性,建议使用。除了上述情况之外,你可以尽可能尝试不显示声明,直到你遇到下一个特殊情况。

相关文章

网友评论

      本文标题:Kotlin-基础语法

      本文链接:https://www.haomeiwen.com/subject/rvngjhtx.html