Kotlin(二)の演算子と式

38632 ワード

文書ディレクトリ
  • 演算子と式
  • 区間演算子
  • 演算子リロード
  • フロー制御
  • ラベル
  • 演算子と式
  • kotlinではjavaの3つの演算子はサポートされず、if式を使用して3つの演算子の代わりに使用します.
  • kotlinの演算子は、+、*などの特定の記号と固定された優先度を有する方法で実現される.各演算子に対応するメソッド名は固定されており、特定の名前のメソッド、メンバーメソッド、または拡張メソッドをタイプに指定すればよい.Kotlinのすべての演算子の機能は一般化されており、数値型、文字列だけでなく、任意のカスタムKotlinクラスにも使用できます.Kotlinの中の&&&、|、?:、===、!==リロードできない
  • です
  • 単一接頭辞
        /**
         *        
         *            
         * +a       a.unaryPlus()
         * -a       a.unaryMinus()
         * !a       a.not()
         */
        var a = 20;
        val b = -a
        val c = a.unaryMinus()
        //  :b:-20,c:-20
        println("b:${b},c:${c}")
    
        val d = +a
        val e = a.unaryPlus()
        //  :b:20,c:20
        println("b:${d},c:${e}")
    
        var flag = true
        val f = !flag
        val g = flag.not()
        //f:false,g:false
        println("f:${f},g:${g}")
    
  • 自己増減
        /****
         *         
         *
         *            
         * a++     a.inc()
         * a--     a.dec()
         */
        //var a = 20,  :20
        println("a:${a++}")
        //  :22
        println("a:${++a}")
    
  • 両目演算子、
        /***
         *      
         *               
         * a+b          a.plus(b)
         * a-b          a.minus(b)
         * a*b          a.times(b)
         * a/b          a.div(b)
         * a%b          a.rem(b)
         * a..b         a.rangeTo(b)
         */
        //  :11
        println(5 + 6)
        //  :11
        println(5.plus(6))
        //  :30
        println(5 * 6)
        //  :30
        println(5.times(6))
          
        // kotlin 1+""       ,  Int   +     1.toString()+""
        // kotlin ""+1     
          
    
  • inと!in
        /**
         * a in b    b.contains(a)
         * a !in b   !b.contains(a)
         */
        var str = "jannal"
        println(str.contains("jan"))
        println("jan" in str)
    
  • インデックスアクセス演算子
        /**
         *        
         * a[i]   a.get(i)
         * a[i,j] a.get(i,j)
         * a[i1,...,in] a.get(i1,...,in)
         * a[i] = b   a.set(i,b)
         * a[i,j] = b   a.set(i,j,b)
         * a[i1,...,in]=b  a.set(i1,...,in,b)
         *     get set            ,  String ArrayList
         */
    
        var list = ArrayList<String>()
        list.add("jannal")
        list.add("tom")
        list.add("jack")
        //tom
        println(list[1])
        list[1] = "tomcat"
        //tomcat
        println(list[1])
    
  • 呼び出し演算子
        /**
         *      
         * a()   a.invoke()
         * a(b)  a.invoke(b)
         * a(b1,b2) a.invoke(b1,b2)
         * a(b1,b2,b3...)  a.invoke(b1,b2,b3)
          *
         */
        val s = "java.lang.String"
        val method = Class.forName(s).getMethod("length");
        //  :4
        println(method.invoke("java"))
        //  :4
        println(method("java"))
    
  • 一般化割付演算子
        /**
         *        
         * a+=b  a.plusAssign(b)
         * a-=b  a.minusAssign(b)
         * a*=b  a.timesAssign(b)
         * a/=b  a.divAssign(b)
         * a%=b  a.remsAssign(b)
         *
         *        plusAssign()    
         *  -     ,  plus()   ,    。
         *  -     ,  plus()   ,    plusAssign      ,    '
         *  -           , a+=b    a=a+b
         */
    
  • は不等演算子
        /**
         *          
         *              
         * a==b     a?.equals(b)?:(b===null)
         * a!=b     !(a?.equals(b)?:(b===null))
         * == equals  ,   ==       
         * java  == !=  kotlin   === !==  ,=== !==    
         */
    
        var s1 = java.lang.String("java")
        var s2 = java.lang.String("java")
    
        println(s1 == s2)//true
        println(s1.equals(s2))//true
        println(s1 === s2)//false
        println(s1 !== s2)//true
    
        var s3 = "java"
        var s4 = "java"
        println(s3 == s4)//true
        println(s3 === s4)//true
    
  • と等しい.
  • 比較演算子
    		/**
         *      
         * a>b      a.compareTo(b)>0
         * a=b     a.compareTo(b)>=0
         * a<=b     a.compareTo(b)<=0
         *       compareTo         (  Compareable  )          
         */
        var s5 = "java"
        var s6 = "kotlin"
        println(s5 > s6)//false
        println(s5.compareTo(s6) > 0)//false
    
  • is演算子javaのinstanceofに似ていますが、instanceofの判断後に強制変換が必要ですが、is演算子は自動変換
    if(a is String){
      println(a.length)
    }
    
  • を表示する必要はありません.
  • as演算子は、参照タイプの表示タイプ変換を実行するために使用され、変換するタイプが指定したタイプと互換性がある場合、変換は成功します.タイプが互換性がない場合、ClassCastException異常が放出されます.asを使ってもいいですか?演算子、変換に失敗した場合null
    		open class Parent
    		class Child : Parent()
    
    		val parent = Parent()
        val child = Child()
    
        //           
        println(child as Parent)
        
          //             
        println(parent as? Child) //null
        val parent1: Parent = child
        println(parent1 as Child) //             ,        
        println(parent as Child) //               ,     java.lang.ClassCastException
    
  • を返します.
    区間演算子
  • 区間演算子
  • 閉区間:a...bは、a~b(境界を含む)のすべての値を定義する区間である.閉区間については、aはb
  • より大きくてはならない.
  • 開区間:半開区間a until b[a,b]、a~b(前閉後開)のすべての値の区間から、配列やリストを巡るのが便利(インデックス値が0から長さ-1まで)
  • 逆方向区間:a downTo bは、区間が大きいから小さい(downToは実はinfix関数である).b a
  • より大きくてはならない
  • step演算子(infix関数)によって区間のステップ長
  • を明示的に指定することができる.
  • ケース
    	  var rangeNum = 2..6
        for (num in rangeNum) {
            println("${num} * 5 = ${num * 5}")
        }
    
        var users = arrayOf("jannal", "tom", "jack")
        for (index in 0 until users.size) {
            println(" ${index + 1}      :${users[index]}")
        }
    
        // 6    2,     1
        var rangeNum1 = 6 downTo 2
        for (num in rangeNum1) {
            //65432
            print(num)
        }
        println()
        // 6   2,     2
        var rangeNum2 = 6 downTo 2 step 2
        for (num in rangeNum2) {
            //642
            print(num)
        }
    
  • 演算子の再ロード
  • Kotlinの演算子は、特定の名前の方法でサポートされています.したがって、これらの名前を再ロードする方法だけで、任意のクラスにこれらの演算子を追加できます.
    /**
     *        
     *  1.           unaryPlus()、unaryMinus()、not()
     *  2.  operator    
     *
     *             
     */
    data class Data(val x: Int, val y: Int) {
    
        operator fun unaryMinus(): Data {
            return Data(-x, -y)
        }
    
    }
    
    //         Data   not()  
    operator fun Data.not(): Data {
        return Data(-x, -y)
    }
    
    fun main(args: Array<String>) {
        val d = Data(4, 10)
        println(-d)
        println(!d)
    }
    

  • プロセス制御
  • kotlinは、switchの代わりに2つのブランチifとwhenを提供し、ifは式であり、すなわち、ifブランチコードブロックの最後の式がブロックの値として返され、ifが式としてelseブランチが必要である場合.kotlinには三元演算子はなくif式により
    //if     
    var age = 20
    var str = if (age > 20) "age  20" else if (age < 20) "age  20" else "age  20"
    //age  20
    println(str)
    
    //          
    var result = if(true) 1 else 0
    println(result)
    
  • を実現できる.
  • when
  • はcaseキーワード
  • を使用する必要はありません.
  • case値の後のコロンは、矢印(->)
  • を使用するように変更されました.
  • defaultをより意味のある、より明確なelse
  • に変更
  • whenは、複数の値
  • に一致することができる
  • when分岐後の値は定数を必要とせず、任意の式
  • であってもよい.
  • whenブランチ条件式のタイプには何の要求もありません(条件式がブランチの値と==比較してtrueを返す限り)
  • whenブランチは式
  • としてもよい
  • whenブランチ処理可能範囲
  • ケース
    fun main(args: Array<String>) {
    
    
        //if     
        var age = 20
        //age  20
        var str = if (age > 20) "age  20" else if (age < 20) "age  20" else "age  20"
        println(str)
    
        var score = 'B'
        when (score) {
            'A' -> println("  ")
            'B' -> println("  ")
            'C' -> println(" ")
            'D' -> println("  ")
            'E', 'F' -> {
                println(" ")
            }
            else -> println("   ")
        }
    }
    
     	//when in、!in  ,            
        var num: Int = Random().nextInt(100)
        var str1 = when(num){
            in 1..60 -> "1~60"
            in 61..70 -> "61~70"
            in 71..80 -> "71~80"
            in 81..90 -> "81~90"
            else -> "91~100"
        }
        println(num)
        println(str1)
          
        //  Kotlin 1.3  ,   when           ,              when 
        when (val num2: Int = Random().nextInt(100)) {
            in 1..60 -> println("1~60")
            in 61..70 -> println("61~70")
            in 71..80 -> println("71~80")
            in 81..90 -> println("81~90")
            else -> println("91~100")
        }    
          
    
        var a: String? = "1"
        val mode = when {
            a == "1" -> 1
            a == "2" -> 2
            else -> 0
        }
        //1
        println(mode)
    
  • whenを用いて階乗関数
    fun fact(n: Int): Int {
        return when (n) {
            0, 1 -> 1
            else -> n * fact(n - 1)
        }
    }
    
  • を実現する
  • breakは外層サイクルを中断し、カスタムラベルouter@
    
        //  break      
        outer@ for (i in 0 until 5) {
            var j = 0
            while (j < 3) {
                println("i:${i},j:${j++}")
                if (j == 2) {
                    break@outer
                }
            }
        }
    
  • を使用します.
  • continue外層サイクル
        //  continue      
        outer@ for (i in 0 until 5) {
            var j = 0
            while (j < 3) {
                println("i:${i},j:${j++}")
                if (j == 2) {
                    continue@outer
                }
            }
        }
    
  • をスキップ
    タブ
  • Kotlinではどの式でもラベル(label)を使用してタグ付けできます.ラベルの形式は識別子の後に@記号が付きます.たとえばabc@は有効なラベルです.ラベルでreturn、break、continue文のジャンプ
        var array = intArrayOf(1, 2, 3, 4)
        // lambda        start@,     
        //        lambda            
        array.forEach start@{
            if (it == 3) {
                return@start
            }
            println(it)
        }
        //    
        array.forEach {
            if (it == 3) {
                return@forEach
            }
            println(it)
        }
      :
    1
    2
    4
    1
    2
    4
    
  • を制御できます.