美文网首页
Kotlin学习笔记(三)-程序结构(下 )

Kotlin学习笔记(三)-程序结构(下 )

作者: g小志 | 来源:发表于2019-12-13 15:02 被阅读0次

    [toc]

    前言

    继续讲下程序结构,这部分相对简单,有时候可能会比较啰嗦,笔记嘛!就是在学习过程中我遇到的问题,作为记录。大家没有遇到问题更好。有些是个人理解,有更好的理解欢迎在评论。

    操作符重载(运算符重载)

    这部分官网还是比较好理解的,而且还是中文操作符重载建议去看下 举例:

    class Complex(var real: Double, var imaginary: Double) {
    
        operator fun plus(other: Complex): Complex {
            return Complex(real + other.real, imaginary + other.imaginary)
        }
    
        operator fun plus(other: Int): Complex {
            return Complex(real + other, imaginary + other)
        }
    
        operator fun plus(other: Any): Int {
            return real.toInt()
        }
    
        override fun toString(): String {
            return "$real +${imaginary}i"
        }
    }
    
    class Book {
        infix fun on(any: Any): Boolean {
            return false
        }
    }
    
    class Desk
    
    fun main(args: Array<String>) {
        val c1 = Complex(2.0, 3.5)
        val c2 = Complex(4.0, 7.5)
        println(c1 + c2)
        println(c1 + 5)
        println(c1 + "HelloWorld")
        if ("a" in args) {// infix 中缀表达式 不可乱用 降低可读性
        }
        if (Book() on Desk()) {//DSL比较常用
        }
    }
    

    总结:

    • 运算符重载方法必须用operator表示这个是运算符方法
    • 运算符重载只能按照官网已有的方法名进行重载,如+ plus - minus += plusAssign
    • 只对参数个数有要求,对参数类型,返回类型无要求
    表达式(中缀表达式,分支表达式,when表达式)
    • 中缀表达式

    方法只有一个参数的时候可以不用对象.方法名这种方式调用:

    class Book {
        infix fun on(any: Any): Boolean {
            return false
        }
    }
    class Desk
    
    fun main(args: Array<String>) {
        if (Book() on Desk()) {//DSL比较常用
        }
    }
    

    中缀表达式常用在DSL中,不建议使用,否则降低可读性

    • 分支表达式

    if语句:

    fun main(args: Array<String>) {
        val mode = if (args.isNotEmpty() && args[0] == "1") {
            0
        } else {
            1
        }
    }
    
    

    不交条件语句而叫表达式,是因为Kotlin中时带返回值

    • when表达式

    功能类似于Java中的switch,也是带有返回值的

    fun main(args: Array<String>) {
        val x = 5
        when (x) {
            !in 1..100 -> println("$x is not in 100")
            in 1..100 -> println("$x is in 100 ")
            args[0].toInt() -> println("x==args[0]")
            is Int -> println("Hello is $x")
            else -> println("default case")
        }
    
        val mode = when {//有返回值
            args[0].toInt() == 5 -> 1
            else -> 2
        }
    }
    

    当条件匹配下面的将不会执行,都没有匹配的则执行 else ->后面的语句

    默认参数 变长参数 具名参数
    • 默认参数

    这些属性都非常简单,直接用例子:

    fun hello(char: Char='A'){
        
    }
    

    默认参数就是给形参指定一个默认值,当调用时可以不传参数。不传时使用默认值

    • 变长参数

    在Java中也有类似的变长参数

    Java
     public void vararg1(String... strings) {
    }
    
    Kotlin  
    public void vararg1(vararg args:String) {
    }
    

    变长参数类似于数组。遍历方式与数组或是集合相同。
    但是不用的Java的变长参数只能作为参数的最后一个Kotlin是没要求的,如:

    Java 
        public void vararg1(String... strings) {
        }//正确
        public void vararg2(String... strings,int i) {
        }//错误
    

    在Kotlin中因为有具名参数所以是没有要求的

    • 具名参数
      具名参数就在传入参数的同时,写上参数名称,如:
    fun hello(double: Double, vararg args: Int, string: String) {
        args.forEach(::println)
        println(string)
    }
    调用:
       hello(3.0, 1, 2, 3, 4, string = "Hello")//在变长参数之前是不需要具名参数的 后面是具名参数 即string= 不指定报错
    
    • 数组展开(Spread Operator)
        val array = intArrayOf(1, 2, 3, 4)
        val list = ArrayList<Int>()
        list.add(1)
        list.add(2)
        list.add(3)
        hello(*array, string = "hello")
        hello(3.0, *array, string = "hello")
        hello(args = *array, string = "hello")//不传的话 后面的参数使用具名参数
    //    hello(*list,string = "hello")//list 现在还不支持* 表示
    
    - *操作符可以展开数组,现在还不支持展开集合
    
    - *操作符只用于变长参数列表的实参
    
    - *操作符不能重载    
    
    - *不算一般意义上的运算符  
    

    结语

    这篇就结束了,下篇是关于面向对象相关的笔记

    Github源码直接运行,包含全部详细笔记

    相关文章

      网友评论

          本文标题:Kotlin学习笔记(三)-程序结构(下 )

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