Kotlin 基础语法

本文参考官方文档:http://kotlinlang.org/docs/kotlin-docs.pdf
本文参考博客:《灰蓝时光》

定义包的规范应位于源文件的顶部

package my.demo
import java.awt.Rectangle
import java.util.*

Kotlin 中的注释

// --- 单行注释---
/* --- 多行注释 ---*/

定义函数

// 带有两个Int参数、返回Int的函数:
fun sum(a:Int, b:Int):Int{
    return a + b  // 返回的是Int
}

// 主函数入口,程序执行:定义函数
fun main(args:Array<String>){
    print("sum of 3 and 5 is ")  // print 打印不换行
    println(sum(3,5))  // println 打印换行
}
// 将表达式作为函数体、返回值类型自动推断的函数:
fun sum(a:Int, b:Int) = a + b

fun main(args:Array<String>){
    println("sum of 19 and 23 is ${sum(19, 23)}")  // ${} 占位
}
// 函数返回无意义的值
fun print_sum(a:Int, b:Int): Unit{
    println("sum of $a and $b is ${a + b}")  // $ 占位
}

fun main (args: Array<String>){
    print_sum(-1, 8)
}
 //  Unit 返回类型可以省略:
fun printSum(a:Int, b:Int){
    println("sum of $a and $b is ${a + b}")
}

fun main(args: Array<String>){
    printSum(-1, 8)
}

定义变量

// 一次赋值--只读--局部变量
fun main(args: Array<String>){
    val a: Int = 1 // 立即赋值
    val b = 2  // 自动推断出 ‘Int’ 类型
    val c:Int  // 如果没有初始值类型不能省略
    c = 3
    println("a = $a, b = $b, c = $c")
}

// 可变变量
fun main(args: Array<String>){
    var x = 5  // 自动推断出“Int”类型
    x += 1
    println("x = $x")
}
// 顶层变量:
val PI = 3.14
var x = 0
fun incrementX(){
    x += 1
}

fun main(args: Array<String>){
    println("x = $x, PI = $PI")
    incrementX()
    println("incrementX()")
    println("x = $x, PI = $PI")
}
/*变量还可以作为属性和字段使用 */

使用字符串模板

fun main(args:Array<String>){
    var a = 1
    // 模板中的简单名称
    val s1 = "a is $a"
    a = 2
    // 模板中的任意表达式:
    val s2 = "${s1.replace("is", "was")}, but now is $a"
    println(s2)
}

使用条件表达式

fun maxOf(a:Int, b:Int):Int{
    return if (a > b){
        a
    }else{
        b
    }
}
fun main(args:Array<String>){
    println("max of 0 and 42 is ${maxOf(0, 42)}")
}
// 使用if作为表达式:
fun moxOf(a:Int, b:Int) = if (a > b) a else b
fun main(args: Array<String>){
    println("maxOf of 0 and 42 is ${maxOf(0, 42)}")
}

使用可空值及null检测

// 当变量的值可以为null的时候,必须在声明处的类型后添加? 用来标识该应用可为空。
fun parseInt(str:String):Int?{
    // ......
}
// 使用返回可空值的函数
fun parseInt(string: String):Int?{
    return string.toIntOrNull()

fun printProduct(arg1:String, arg2:String){
    val x = parseInt(arg1)
    val y = parseInt(arg2)
    // 直接使用 x * y 会导致编译器错误,因为他们可能为null
    if (x == null) {
        println("Wrong number format in arg1:'$arg1'")
        return
    }
    if (y == null){
        println("Wrong number format in arg2: '$arg2'")
        return
    }
}
    // 在空检测后,x 和 y自动转换为非空值(non-nullable)
    println(x * y)
}

fun main(args:Array<String>){
    printProduct("6", "7")
    printProduct("a", "7")
    printProduct("6", "b")
    printProduct("a", "b")
}

使用类型检测及自动类型转换

/* is 运算符检测一个表达式是否某类型的一个实例。
* 如果一个不可变的局部变量或属性已经判断出为某类型
* 那么检测后的分支中可以直接当作该类型使用,无需显示转换*/
fun getStringLength(obj: Any):Int?{
    if (obj is String) {
        // 'obj'在条件分支内自动转换成'String'
        return obj.length
    }
    // 在离开类型检测分支后,'obj'仍然是'Any'类型
    return null
}
fun main(args:Array<String>){
    fun printLength(obj: Any){
        println("'$obj' string length is ${getStringLength(obj) ?: " ... err, not a string"}")
    }
    printLength("Incomprehensibilities")
    printLength(1000)
    printLength(listOf(Any()))
}

使用for循环

fun main(args:Array<String>){
    val items = listOf("apple", "banana", "kiwi")
    for (item in items){
        println(item)
    }
}

使用while表达式

fun main(args: Array<String>){
    val items = listOf("apple", "banana", "kiwi")
    var index = 0
    while (index < items.size){
        println("item at $index is ${items[index]}")
        index++
    }
}

使用when表达式

fun describe(obj:Any):String =
        when(obj){
            1          -> "One"
            "Hello"    -> "Greeting"
            is Long    -> "Long"
            !is String -> "Not a string"
            else       -> "Unknown"
        }

fun main(args:Array<String>){
    println(describe(1))
    println(describe("Hello"))
    println(describe(1000L))
    println(describe(2))
    println(describe("other"))
}

使用区间range

// 使用 in 运算符来检测某个数字是否在指定区间内:
fun main(args:Array<String>){
    val x = 10
    val y = 9
    if (x in 1..y+1){
        println("fits in range")
    }
}
// 检测某个数字是否在指定区间外:
fun main(args:Array<String>){
    val list = listOf("a", "b", "c")
    if (-1 !in 0..list.lastIndex){
        println("-1 is out of range")
    }
    if (list.size !in list.indices){
        println("list size is out of valid list indices range too")
    }
}
// 区间迭代
fun main(args:Array<String>){
    for (x in 1..5){
        print(x)
    }
}
// 数列迭代
fun main(args:Array<String>){
    for (x in 2..10 step 2){
        print(x)
    }
}

使用集合

// 对集合进行迭代
fun main(args:Array<String>){
    val items = listOf("apple", "banana", "kiwi")
    for (item in items){
        println(item)
    }
}
// 使用 in 运算符来判断集合内是否包含某实例:
fun main(args:Array<String>){
    val items = listOf("apple", "banana", "kiwi")
    when{
        "orange" in items -> println("juicy")
        "apple" in items -> println("apple is fine too")
    }
}
// 使用lambda表达式来过滤(filter)和映射(map)集合:
fun main(args:Array<String>){
    val fruits = listOf("banana", "avocado", "apple", "kiwi")
    fruits
        .filter { it.startsWith("a") }
        .sortedBy { it }
        .map { it.toUpperCase() }  // 字母全部转换成大写
        .forEach { println(it) }
}

创建基本类及其实例:

// 抽象类
abstract class Shape (private val sides : List <Double> ) {
    val perimeter : Double get() = sides.sum()
    abstract fun calculateArea():Double
}
interface RectangleProperties{
    val  isSquare:Boolean
}

// 创建矩形类
class Rectangle(
        var height:Double,
        var length: Double
):Shape(listOf(height, length, height, length)), RectangleProperties{
    override val isSquare: Boolean
        get() = length == height

    override fun calculateArea(): Double = height * length
}

//  创建三角形类
class Triangle(
        private var sideA:Double,
        private var sideB:Double,
        private var sideC:Double
        ):Shape(listOf(sideA, sideB, sideC)){
    override fun calculateArea(): Double {
        val s = perimeter / 2
        return  Math.sqrt(s * (s - sideA) * (s - sideB) * (s - sideC))
    }
}

fun main(args:Array<String>){
    val rectangle = Rectangle(5.0,2.0)  // 不需要“new”关键字
    val triangle = Triangle(3.0,4.0,5.0)

    println("Area of rectangle is ${rectangle.calculateArea()}, its perimeter is ${rectangle.perimeter}")
    println("Area of triangle is ${triangle.calculateArea()}, its perimeter is ${triangle.perimeter}")
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,236评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,867评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,715评论 0 340
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,899评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,895评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,733评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,085评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,722评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,025评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,696评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,816评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,447评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,057评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,254评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,204评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,561评论 2 343

推荐阅读更多精彩内容

  • 每种编程语言都有一定的语法、语义和执行顺序(同步),学习一种新语言也都是从这三者出发,下面我们就只针对kotlin...
    samychen阅读 4,502评论 0 6
  • 标签:kotlinandroidkotlin语法 摘要 如果你真的希望深入的了解kotlin语言,可以查看英文版K...
    活这么大就没饱过阅读 1,330评论 0 0
  • 基本类型 在 Kotlin 中,所有东西都是对象,在这个意义上讲我们可以在任何变量上调用成员函数和属性。 一些类型...
    Whyn阅读 423评论 0 0
  • Kotlin简介 Kotlin是一门与Swift类似的静态类型JVM语言,由JetBrains设计开发并开源。与J...
    吸给007阅读 455评论 1 1
  • 《被缚的爱情》 心房 日升月落般 匆忙 效仿 普罗米修斯的肝脏 暗夜临降 念想如恶鹰刚逃离饥荒 尽情就享 ...
    枫眸阅读 221评论 1 2