• kotlin特性:
  • Kotlin是一种基于JVM的静态类型编程语言
  • 与Java及JVM的完全互操作性
  • 多平台:适合Android、浏览器和本地系统编程
  • 语法简洁不咿嗦(便于学习)
  • 富于表现力和高效的生产力
  • 支持类型推断 例如,我们可以只写 val number=23 编译器会推断这 Int;
  • 可以使用数据类 data class )以极简的方式创建 POJO;
  • 运算符重载相当简单
  • 快速、 方便地扩 置类、自定义类的函数与属性;
  • 区分可空类型和不可空类型。直接在编译期语法层面检查可空类型 提供空安全 保障;
  • Kotlin 含有功能丰富的集合类 StreamAPI;
  • 集成扩展了简单实用的文件 I/ 、正则匹配、线程等工具类;
  • 提供了实用强大的函数式编程支持 一等函数支持, Lambda 达式、高阶函数等;
  • 能够轻松、方便地创建 DSL;
  • 使用更加轻量级的协程进行并发编程
  • IntelliJIDEA 发工具 一等支持;
  • Android 开发有 Android Studio 内置原生支持
  • 提供的 Anko 库( https: //github com/Kotlin/anko )使 Android 开发速度更快。
  • Kotlin是设计运行在JVM上的语言,可以加载到JVM中执行文件中指定操作的字节码,下图 直观所示:

Kotlin-小抄(一)入门与基础语法_修饰符

  • 学习工具:
  • 先运行一个重要的HelloWorld
fun main(args:Array<String>){
println("Hello World")
println(SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date()));
}
  • 通过这个HelloWorld可以看出Kotlin使用fun声明方法,而且可以推断语句分行结束,也可以使用Java的API,下面将详细学习Kotlin语法

基础语法:

  1. 变量与标识符
  • 在Kotlin中所有的变量都是引用类型没有Java的基本数据类型了,Kotlin变量分为val(不可变类型)和var(可变类型)
  • val 只读类型,仅能一次赋值,与Java中的final关键字相同, 尽量使用val可以带来可预测的行为和线程安全等特点。
  • var是可写的,在生命周期中可以被多次赋值
    就会报错error can not be reassigned,从此图可以看出kotlin具有变量类型推断的能力,提供了不少方便
  1. 关键字与修饰符:
  • Kotiin 中的修饰符关键字主要分为 类修饰符、成员修饰符 访问权限修饰符、协变逆变修饰符、函数修饰符、属性修饰符、参数修饰符、具体化类型修饰符等
类修饰符

类修饰符

说明

abstract

抽象类

final

不可被继承final类

enum

枚举类

open

可继承open类

annotation

注解类

sealed

密封类

data

数据类

访问权限修饰符

访问权限修饰符

说明

private

私有,仅当前类可以访问

protected

当前类以及继承该类的可访问

public

默认值,对外可访问

internal

模块内可访问

属性修饰符

属性修饰符

说明

const

常量修饰符

协变逆变修饰符

协变逆变修饰符

说明

in

消费者类型修饰符out T等价于?extends T

out

生产者类型修饰符,in T等价于?super T

函数修饰符

函数修饰符

说明

tailrec

尾递归

operator

运算符重载函数

infix

中缀函数

inline

内联函数

external

外部函数

suspend

挂起协程函数

参数修饰符

参数修饰符

说明

vararg

变长参数修饰符

noinline

不内联函数修饰符

crossinline

限制Lambda表达式直接非局部return返回

具体化类型修饰符

具体化类型修饰符

说明

reified

具体化类型参数

流程控制语句:

* 分支语句(if,when)
* 循环语句(for, while)
* 跳转语句(return、break、continue、throw)
if表达式
  • if…else语句是控制程序流程的最基本的形式,其中else是可选的。在Kotlin中,if是一个表达式,即他会返回一个值(跟Scala一样)。代码示例如下:
  • if的分支可以是代码块,最后的表达式作为该块的值:
  • 例如:
var max = if(a>b){
a
}else{
b
}
if实现三元表达式:
  • if(true) 1 else 0
when表达式:
  • 类似于switch…case表达式,when会对所有的分支进行检查直到有一个条件可以被满足
var input = Scanner(System.`in`);
var obj = input.next();
when(obj){
// 0,1,2,4,5,6,7,8 -> println("${obj}=>这是一个数字");
"hello" -> println("${obj}==>这是hello")
else -> println("${pbj}===>Java中的default")
}
  • 在when中也可以使用in和!in来检查一个值是否在一个区间和集合中:
fun fact(n:Int):Int{
var result = 1
when(n){
0, 1 -> result = 1;
else ->result = n*fact(n-1)
}
return result;
}
for循环:
  • for循环可以对任何提供迭代器(iterator)的对象进行遍历:
for(item in collection){
println(item);
}
  • 通过索引遍历一个数组:
for(i in array.indices){
println(array[i]);
}
或者
for((index, value) in array.withIndex()){
println($index, $value);
}
  • 使用range
for(i in 1..10){
println(i);
}
或者
(1..10).forEach{
prineln(it);
}
  • eg:
fun sumFact(n:Int):Int {
var sum = 0;
for (i in 1.rangeTo(n)) {
sum += fact(i);
}
return sum;
}
  • while循环:
while与dowhile和C语言和Java相同
  • break和continue也和C语言和Java中的含义相同
  • return 返回:
  • 可以和Java一样使用
fun sum(a: Int,b:Int):Int{
return a + b;
}
* 在Kotlin中可以使用函数字面量来获取函数的返回值 
* 函数字面量:Kotlin中可以直接使用“=”符号返回一个函数的值
//在Kotlin中可以使用函数字面量来获取函数的返回值
fun sum(a:Int, b:Int) = a + b
//不一样的使用方式
val sumf = fun(a:Int,b:Int) = {a+b}
这时需要使用sumf(1,1).invoke()来获取返回值,因为此时为一个Lambda表达式
标签:
  • 可以使用标签来控制return,break,continue语句的跳转到的位置
val intArray = inArrayOf(1, 2, 3, 4, 5)
intArray.forEach here@{//跳转到该处
if(it==3) return@here
println(it);
}
throw表达式
  • Kotlin中throw是表达式,他的类型是特殊类型Nothing, 类似与void
  • 一般使用Nothing来标记无返回的函数
  • 如果把一个throw表达式的值赋值给一个变量,需要显示声明类型为Nothing
val ex:Nothing = throw Exception("nothing")