让我们以一个经典的例子开始:打印“Hello, world!”
从上面代码我们能看到哪些特点呢?
上面已经看了一个没有返回值得函数,下面我们看一个有返回值的函数:
我们看到返回类型放在了参数列表之后。
注意:在Kotlin中if是个有返回值的表达式。类似于Java中的三目运算符(a > b)? a : b
无返回类型
有返回类型
语句和表达式在Kotlin中,if是个表达式,而不是一个语句。语句和表达式的区别在于,表达式是一个值,可以被用作另外表达式的一部分;而语句总是一个包含它的代码块内的顶层元素,没有自己的值。在Java中,所有的控制结构都是语句,但是在Kotlin中,大部分控制结构,除了循环(for , do和do/while),是表达式。联合控制结构和其他的表达式,可以让你简洁表达许多通常的模式。另外一方面,在Java中赋值是表达式,但是在Kotlin中变成了语句。这有效避免了比较和赋值之间的混淆,这个混淆也是错误的一个来源。
可以让前面的函数变得更简单。因为他的函数体是由单个表达式构成,可以用这个表达式作为完整的函数体,并去掉花括号和return语句:
如果用花括号来表达函数主体,我们叫这个函数为代码块体,如果直接返回表达式,我们叫它为表达式体。INTELLIJ IDEA提示 : IntelliJ IDEA提供了在两种不同函数风格“Convert to expression body”和 “Convert to block body”之间的转换
表达式体的函数在Kotlin代码中很常见,不光用在一些简单的函数中,也用在许多复杂的表达式中,如:if、when、try等,后续介绍
我们的max函数还可以进一步简化,如下:
val question = “The Ultimate Question of Life, the Universe, and Everything”val answer = 42
val answer: Int = 42
val answer:Intanswer = 42
val message: Stringif (canPerformOperation()) {message = “Success”// … perform the operation }else {message = “Failed”}
var answer = 42answer = “no answer”//编译错误:类型不匹配
/* Java */public class Person {private final String name;
/* Kotlin*/class Person(val name: String)
class Person(val name: String, //只读属性:自动生成一个域和简单的gettervar isMarried: Boolean //可写属性:一个域,getter和setter)
class Rectangle(val height: Int, val width: Int) {val isSquare: Booleanget() { //Property getter declarationreturn height == width}}
class Rectangle(val height: Int, val width: Int) {val isSquare: Booleanget() = height == width}
“`
接下来看一下java和kotlin的目录结构
如上图:java中,目录层级结构照搬了包层级结构
如上图:kotlin中,不需要遵循目录层级结构
在kotlin中,可以把多个类放在同一个文件中,文件的名字还可以随意选择。
但是,在大多数情况下,跟随Java目录结构和根据包结构把源码组织成目录,是最佳实践。特别是Kotlin和Java混合的项目,坚持这样的结构特别重要。因为这样做可以让你逐步迁移代码,而没有引入意外的情况。但是当类很小的时候(在Kotlin中,这些经常存在)。请你不要犹豫把多个类合成到同一个文件。