Kotlin文法1

6768 ワード

1.定数と変数
Kotlinでは、valを使用して定数を宣言し、varを使用して変数を宣言します.
Kotlinは、宣言val a = 100のような自動タイプ推定の特性を有し、aのタイプがIntであることを自動的に推定するので、タイプの宣言を省略することができます.もちろん、変数のタイプを明示的に宣言することもできます.例えば、val a:Int = 100は、:Typeの形式で変数名の後に続くことができます.変数を宣言するときに初期化操作を行わないと、コンパイラは変数のタイプを推定できません.この場合、明示的な宣言タイプを使用する必要があります.
   //    
    val a: Int = 1  //     
    val b = 2   //       `Int`   
    val c: Int  //              
    c = 3       //     
   //    
    var x = 5 //       `Int`   
    x += 1

2.データ型
2.1整数
kotlinは4つの整数タイプを提供します.
  • Byteは8ビット整数
  • を表す
  • Short表示16ビット整数
  • Int 32ビット整数
  • Long表示64ビット整数
  • 数値定数のフォント値は次のとおりです.
  • 十進法:123
  • 16進0 xで始まる
  • バイナリ0 bで始まる注意:8進法はサポートされていません
  •     val a:Int = 123
        val b:Long = 0b11
        val c = 0xA
        println("a=$a,b=$b,c=$c")//a=123,b=3,c=10
    

    アンダースコアを使用すると、数値定数をより読みやすくすることができます.
    val oneMillion = 1_000_000
    val creditCardNumber = 1234_5678_9012_3456L
    val socialSecurityNumber = 999_99_9999L
    val hexBytes = 0xFF_EC_DE_5E
    val bytes = 0b11010010_01101001_10010100_10010010
    

    2.2浮動小数点数
    kotlinは2つの浮動小数点タイプを提供します
  • Double表示64ビット浮動小数点タイプ
  • Floatは32ビット浮動小数点タイプ
  • を表す
        val a:Double = 123.5e10
        val b:Float = 123.5f
        print("a=$a,b=$b")//a=1.235E12,b=123.5
    

    2.3明示的な変換
    kotlinの小さいタイプは、暗黙的に大きなタイプに変換できません.これは,明示的な変換を行わずにByte型値をInt変数に割り当てることができないことを意味する.
        val b: Byte = 1 // OK,          
        val i: Int = b //   
    

    数値を拡張するために明示的に変換できます
        val b: Byte = 1 // OK,          
        val i: Int = b.toInt()
    

    各数値タイプは、次の変換をサポートします.
  • toByte(): Byte
  • toShort(): Short
  • toInt(): Int
  • toLong(): Long
  • toFloat(): Float
  • toDouble(): Double
  • toChar(): Char

  • 2.4文字タイプ
    文字はCharタイプで表示
    2.5ブールタイプ
    ブールはBooleanタイプで表され、truefalseの2つの値があります.
    2.6文字列
    文字列はStringタイプで表されます.文字列は可変ではありません.文字列の要素文字は、インデックス演算子を使用してアクセスできます:s[i].forで反復文字列をループできます.
        val a = "Hello World!"
        println("${a[4]}")//o
        for (c in a){
            println("$c")
        }
    
    は、3つの引用符("""""")で囲まれており、内部にはエスケープがなく、改行やその他の文字を含めることができます.
        val text = """
        for (c in "foo")
            print(c)
        """
        println("$text")
    

    文字列にはテンプレート式が含まれ、値を求めて文字列にマージされます.テンプレート式はドル($)で始まり、簡単な名前で構成されています.
        val i = 10
        val s = "i = $i" //       "i = 10"
        val str = "$s.length is ${s.length}" //       "i = 10.length is 6"
        println("$str") 
    

    原生文字列とエスケープ文字列の内部にはテンプレートがサポートされています.原生文字列に$文字を表す必要がある場合(反スラッシュエスケープはサポートされていません)、次の構文を使用します.
    val price = """
    ${'$'}9.99
    """
    

    2.6空のセキュリティ
    Kotlinでは、タイプシステムは、null(空参照可能)を受け入れるか、空参照でないかを区別します.たとえば、Stringタイプの通常の変数はnullを収容できません.
    var a: String = "abc"
    a = null //     
    

    NULLを許可する場合は、変数をNULL文字列として宣言し、String?と書きます.
    var b: String? = "abc"
    b = null // ok
    

    現在、aのメソッドを呼び出したり、そのプロパティにアクセスしたりすると、NPEが発生しないことを保証し、安心して使用できます.
    val l = a.length
    

    しかし、bの同じプロパティにアクセスしたい場合は、これは安全ではありません.コンパイラはエラーを報告します.
    val l = b.length //   :  “b”    
    

    変数bにアクセスするには、以下の方法を使用します.
  • 条件でnullをチェックします.bがnullであるかどうかを明示的にチェックすると、コンパイラは実行したチェックの情報を追跡し、if内部でlengthを呼び出すことができます.
  •    if (b != null && b.length > 0) {
            print("String of length ${b.length}")
        } else {
            print("Empty string")
        }
    
  • セキュリティコールオペレータを使用?
  • b?.length
    

    bが空でない場合は、b.lengthを返します.そうでない場合はnullを返します.この式のタイプはIntです.
  • Elvisオペレータを使用?:左側の式が空でない場合、elvisオペレータは左側の式を返します.そうでない場合、右側の式を返します.左側が空の場合、右側の式は評価されません.
  • val l = b?.length ?: -1
    

    4.!!オペレータb!!を使用します.bが空でない場合、空でないb値が返されます.そうでない場合、NPE異常が放出されます.
    val l = b!!.length
    

    2.7安全なタイプ変換
    オブジェクトがターゲット・タイプでない場合、通常のタイプ変換によってClassCastExceptionが発生する可能性があります.もう1つの選択肢は、安全なタイプ変換を使用することです.変換が失敗した場合はnullを返します.
    val aInt: Int? = a as? Int 
    

    2.8配列
    配列はKotlinでArrayクラスで表される.
    ライブラリ関数arrayOf()を使用して配列を作成し、要素値を渡すことができます.または、ライブラリ関数arrayOfNulls()を使用して、指定したサイズの要素が空の配列を作成できます.
    3.制御フロー
    3.1 if式
    Kotlinでは、ifは式であり、値が返されます.したがって、通常のifがこの役割を果たすため、3元演算子(条件?そして:そうでなければ)は必要ありません.
    //      
    val max = if (a > b) a else b
    

    一般的な使い方
    //     
    var max = a 
    if (a < b) max = b
    
    // if...else...
    var max: Int
    if (a > b) {
        max = a
    } else {
        max = b
    }
    

    ifのブランチはコードブロックであり、最後の式はブロックの値として使用されます.
    val max = if (a > b) {
        print("Choose a")
        a
    } else {
        print("Choose b")
        b
    }
    

    文ではなくifを式として使用する場合(たとえば、その値を返すか、変数に割り当てる)、elseブランチが必要です.
    3.2 when式whenJavaにおけるswitchのように使用されます.whenは、あるブランチが条件を満たすまで、そのパラメータをすべてのブランチ条件と順番に比較します.whenは、式としても文としても使用できます.式として使用される場合、条件を満たすブランチの値は式全体の値であり、文として使用される場合、個別のブランチは無視されますの値です.(ifのように、各ブランチはブロック内の最後の式の値であるコードブロックであってもよい).
    他のブランチが条件を満たさない場合はelseブランチが評価されます.whenが式として使用される場合は、コンパイラがすべての可能性が上書きされていることを検出できない限り、elseブランチが必要です.
    var x = 0
    when (x) {
        1 -> print("x == 1")
        2 -> print("x == 2")
        else -> { //      
            print("x is neither 1 nor 2")
        }
    }
    

    複数のブランチを同じ方法で処理する必要がある場合は、複数のブランチ条件をカンマで区切ることができます.
    var x = 0
    when (x) {
        0, 1 -> print("x == 0 or x == 1")
        else -> print("otherwise")
    }
    

    定数だけでなく任意の式を分岐条件+として使用できます.
    when (x) {
        parseInt(s) -> print("s encodes x")
        else -> print("s does not encode x")
    }
    

    また、(in)または(!in)の区間または集合に値を検出することもできます.
        var x = 30
        when (x) {
            in 1..10 -> print("x is in the range")
            !in 10..20 -> print("x is outside the range") //
            else -> print("none of the above")
        }
        //x is outside the range
    

    3.3 Forサイクル
    forループは、反復器(iterator)を提供する任意のオブジェクトを巡回することができます.構文は次のとおりです.
    for (item in collection) print(item)
    

    3.4 whileサイクル
    同Java
    3.5 do...while
    同Java
    3.6 breakとcontinue文
    同Java