在代码中学习 Kotlin 基本语法

一、基本语法

fun main(args: Array<String>) {

    // 定义变量
    // 定义不可变变量
    val a: Int = 1 // 直接赋值
    val b = 2 // 不指定类型,b 被推断为 int 类型
    val c: Int // 只定义不初始化需要制定变量的类型
    c = 3 // 为变量赋值
    // val 定义的变量的值不可更改

    // 定义可变变量
    var d = 4;
    d = a + b;


    // 字符串
    var aa = 1
    // 在字符串中使用变量的值
    var s1 = "aa is $aa"
    aa = 4
    // 在字符串中进行运算
    var s2 = "${s1.replace("is", "was")}, but now is $aa"


    // 创建类的实例
    val rectangle = Rectangle(5.0, 2.0)
    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}")
}


// 定义方法
/**
 * 定义方法的格式:
 * fun 方法名(参数: 参数类型, ...): 返回值类型 {
 *     // 此处为方法体
 * }
 * // 无返回值时,返回值类型可以写:Unit 也可以省略
 *
 */
// 常见写法
fun sum1(a: Int, b: Int): Int {
    return a + b
}

// 当方法体只有1句话的时候可以这么写
fun sum2(a: Int, b: Int) = a + b


// if 条件语句
fun maxOf(a: Int, b: Int): Int {
    if (a > b) {
        return a
    } else {
        return b
    }
}

// 还可以写成如下形式
fun maxOf1(a: Int, b: Int) = if (a > b) a else b


// 类型检测和动态类型转换
// 写法1
fun getStringLength(obj: Any): Int? {
    // 类型检测
    if (obj is String) {
        return obj.length
    }
    return null
}

// 写法2
fun getStringLength1(obj: Any): Int? {
    if (obj !is String) {
        return null
    }
    return obj.length
}

// 写法3
fun getStringLength2(obj: Any): Int? {
    if (obj is String && obj.length > 0) {
        return obj.length
    }
    return null
}


// 循环语句,定义在方法内,方便直接在 main 中调用查看输出情况
fun loop() {
    // for 循环
    val items = listOf("apple", "banana", "kiwifruit")
    // 写法1
    for (item in items) {
        println(item)
    }

    // 写法2
    for (index in items.indices) {
        println("item as $index is ${items[index]}")
    }

    // while 循环
    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"
        }


// 使用范围 (ranges)
fun ranges() {
    val x = 10
    val y = 9
    // 检查某个值是否在一个范围内
    if (x in 1..y+1) {
        println("fits in range")
    }

    // 检查某个值是否在一个范围外
    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")
    }

    // 遍历一个范围
    for(x in 1..5) {
        println(x)
    }
    println()

    // 遍历范围时指定步长
    // 遍历1到10每隔2打印x
    for (x in 1..10 step 2) {
        println(x)
    }
    println()
    // 遍历9到0每隔3打印x
    for (x in 9 downTo 0 step 3) {
        println(x)
    }
}


// 使用集合
fun collections() {
    val items = listOf("apple", "banana", "orange", "abc")
    // 遍历集合
    for (item in items) {
        println(item)
    }
    println()

    // 判断集合是否包含某个对象
    when {
        "aa" in items -> println("juicy")
        "apple" in items -> println("apple is fine too")
    }

    println()

    // 使用 lambda 表达式过滤和包装集合
    items.filter { it.startsWith("a") }
        .sortedBy { it }
        .map { it.toUpperCase() }
        .forEach { println(it) }
}


// 定义类
// 定义抽象类
abstract class Shape(val sides: List<Double>) {
    val perimeter: Double get() = sides.sum()
    abstract fun calculateArea(): Double
}

// 定义接口
interface RectangleProperties {
    val isSquare: Boolean
}

// 定义类 Rectangle 继承 Shape 并实现 RectangleProperties
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
}

// 定义类 Triangle 继承 Shape
class Triangle (var sideA: Double, var sideB: Double, 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))
    }
}

更多文字内容参见官网

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • python 也是很值得学习的一门工具。学好python和R。 1环境管理 管理 Python 版本和环境的工具 ...
    Liam_ml阅读 4,868评论 1 51
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 3,063评论 1 3
  • iOS资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理。...
    Sean_Shi阅读 4,491评论 0 45
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,508评论 0 5
  • 白色床单上躺着一个人,泛黄晦暗的脸上,没什么血色,紧闭着双眼,深锁着眉骨,头发乱铺了一枕头,嘴唇蜕起一层皮...
    苏菲乔安阅读 335评论 0 2