美文网首页
Kotlin基本语法

Kotlin基本语法

作者: bruce1990 | 来源:发表于2020-04-11 11:16 被阅读0次

参考教程
https://www.jianshu.com/p/e42a9ea09ac0
https://www.runoob.com/kotlin/kotlin-basic-syntax.html
kotlin官方文档中文版
作为一名java开发者,先看看java与kotlin的区别

java与kotlin的区别

操作对象:在Kotlin中,所有变量的成员方法和属性都是对象,若无返回值则返回Unit对象,大多数情况下Uint可以省略;Kotlin 中没有 new 关键字
数据类型 & 转换:在Java中通过装箱和拆箱在基本数据类型和包装类型之间相互转换;在Kotlin中,而不管是常量还是变量在声明是都必须具有类型注释或者初始化,如果在声明 & 进行初始化时,会自行推导其数据类型。
编译的角度:和Java一样,Kotlin同样基于JVM。区别在于:后者是静态类型语言,意味着所有变量和表达式类型在编译时已确定。
撰写:在Kotlin中,一句代码结束后不用添加分号 “;”;而在Java中,使用分号“;”标志一句代码结束。

基本语法

导包

包的声明应处于源文件顶部:与java一样
采用import关键字导包 与java一样不同的是它还能导入函数
比如

package my.demo
import  kotlin.text.*

程序入口 main函数

我使用的是Andorid Studio3.5,使用3.1版编译不会出错,运行的时候会报错

fun main() {
    println("Hello World!")
}

函数

函数定义使用关键字 fun,参数格式为:参数 : 类型

fun main() {
    println(sum(1, 1))
    println(sum2(2, 2))
    println("Hello World!")
}

//sampleStart
fun sum(a: Int, b: Int): Int {// Int 参数,返回值 Int
    return a + b
}

fun sum2(a: Int, b: Int) = a + b //不得不佩服kotlin的超前思想还能这么玩,自行推导类型

表达式作为函数体,返回类型自动推断:

fun sum(a: Int, b: Int) = a + b
public fun sum(a: Int, b: Int): Int = a + b   // public 方法则必须明确写出返回类型  经测试不写好像也没问题...

无返回值的函数(类似Java中的void):

fun printSum(a: Int, b: Int): Unit { 
    print(a + b)
}
// 如果是返回 Unit类型,则可以省略(对于public方法也是这样):
public fun printSum(a: Int, b: Int) { 
    print(a + b)
}

默认参数
函数参数可以有默认值,当省略相应的参数时使用默认值。与其他语言相比,这可以减少重 载数量:
a. 如果是继承过来的则不能在子类写默认值了

open class A {
    open fun hi(string: String = "Hi") {

    }
class B : A() {
    override fun hi(string: String) {//不能有默认值
        println(string)
    }
}

fun main() {
    val b = B()
    b.hi()
}
}

b. 如果一个默认参数在一个无默认值的参数之前,那么该默认值只能通过使用命名参数调用该函数来使用:比如

fun foo(num: Int = 0, s: String) {
    println(num)
    println(s)
}
fun main() {
    foo(s = "哈哈")
}

如果在默认参数之后的最后一个参数是 lambda 表达式,那么它既可以作为命名参数在括号内 传入,也可以在括号外传入:

fun foo(bar: Int = 0, baz: Int = 1, qux: () -> Unit) {
    println(baz)
}
调用的时候
    foo {  }//可以这样
    foo(qux = {})//可以这样
可变长参数函数

函数的变长参数可以用 vararg 关键字进行标识:比如

fun vars(vararg v:Int) {
    for (i in v) {
        print(i)
    }
}

print和println的区别就是println可以换行

lambda(匿名函数) 还有这种操作 我的天

lambda表达式使用实例:

    var sumLambda: (Int, Int) -> Int = { x, y -> x + y }
    print(sumLambda(1, 2))

定义常量和变量

可变变量定义:var 关键字
var <标识符> : <类型> = <初始化值>
不可变变量定义:val 关键字,只能赋值一次的变量(类似Java中final修饰的变量)
val <标识符> : <类型> = <初始化值>

常量与变量都可以没有初始化值,但是在引用前必须初始化
编译器支持自动类型判断,即声明时可以不指定类型,由编译器判断。

    val a: Int = 1  // 立即赋值
    val b = 2 //编译器自动推断
    val c: Int      //  如果没有初始值类型不能省略
    c = 3 //明确赋值
    println("a=$a,b=$b,c=$c")
    var d = 5
    d+=1 //改变变量值
    println("d=$d")
    var s="Hello World!"
    println("你好世界$s")

注释 (与java一样不再赘述)

字符串

字符串用String类型表示。字符串是不可变的。字符串的元素字符可以使用索引运算 符访问:s[i] 。可以用for循环迭代字符串:

fun main()  { 
val str =   "abcd" //sampleStart 
for (c  in  str)    
{               println(c) 
}
 //sampleEnd
 }

与java字符串一样可以使用+操作符连接字符串。但是优先使用字符串模板或原始字符串而不是字符串连接。
字符串模板
字符串字面值可以包含模板表达式 ,即一些小段代码,会求值并把结果合并到字符串中。 模 板表达式以美元符( $ )开头,由一个简单的名字构成:

    val i = 10
    println("i = $i")//输出 i = 10
    //或者用花括号括起来的任意表达式:
    val s = "abc"
    println("$s 的长度是${s.length}")//输出 abc 的长度是3
    println("$s 的长度是${b.len(s)}")//输出 abc 的长度是3

NULL检查机制

Kotlin的空安全设计对于声明可为空的参数,在使用时要进行空判断处理,有两种处理方式,字段后加!!像Java一样抛出空异常,另一种字段后加?可不做处理返回值为 null或配合?:做空判断处理

类型检测及自动类型转换

我们可以使用 is 运算符检测一个表达式是否某类型的一个实例(类似于Java中的instanceof关键字)。

fun getStringLength(obj: Any): Int? {//当返回值可能为空时使用?
    if (obj !is String)
        return null
    // 在这个分支中, `obj` 的类型会被自动转换为 `String`
    return obj.length
}

区间

区间表达式由具有操作符形式 .. 的 rangeTo 函数辅以 in 和 !in 形成。
区间是为任何可比较类型定义的,但对于整型原生类型,它有一个优化的实现。以下是使用区间的一些示例:

    for (i in 1..4) println(i) // 输出“1234”
    for (i in 4..1) println(i) // 什么都不输出
    var x = 5
    if (x in 1..10) { // 等同于 1 <= i && i <= 10
        println(x)
    }
// 使用 step 指定步长
    for (i in 1..4 step 2) println(i) // 输出“13”  类似于等差数列

    for (i in 4 downTo 1 step 2) println(i) // 输出“42”  降序
// 使用 until 函数排除结束元素
    for (i in 1 until 10) {   // i in [1, 10) 排除了 10
        println(i)
    }

笔记

1.关于lambda表达式(匿名函数)的理解
通常完整Lambda表达式会由花括号{}括起来,在花括号内先定义完整语法形式的参数声明(并具有可选的类型注解),然后紧跟着 - >符号,- >符号就是由另一个花括号括起来的方法体部分。如果推测的Lambda的返回类型不是Unit,则Lambda体内的最后一个(或可能单个)表达式被视为返回值。
Lambda表达式的完整语法形式:

val sum = { x: Int, y: Int -> x + y }

把所有可选的注解都保留形式

val sum: (Int, Int) -> Int = { x, y -> x + y }

实例

fun main() {
    //lambda(匿名函数)的理解
    val sumLambda: (Int, Int) -> Int = { x, y -> x + y }
    println(sumLambda(1, 2))  // 输出 3
    val lam = {a:Int, b:Int->a-b}
    println(lam(3,2))
}

相关文章

网友评论

      本文标题:Kotlin基本语法

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