scala_サンプルクラス、サンプルオブジェクト、パターンマッチング

11601 ワード

文書ディレクトリ
  • サンプルクラス
  • 定義サンプルクラス
  • 例|サンプルクラス
  • を定義
  • 例|可変メンバー変数
  • applyメソッド
  • toStringメソッド
  • equalsメソッド
  • hashCode方法
  • copyメソッド
  • サンプルオブジェクト
  • 定義
  • 例|定義列挙
  • 単純モードマッチング
  • 定義
  • 守備
  • マッチングセット
  • 整合配列
  • 照合リスト
  • マッチングユニット
  • 例|配列内の要素
  • を取得する.
  • 例|Listのデータを取得する
  • サンプルクラス
    サンプルクラスは特殊なクラスで、データを保存するためのクラス(Java POJOクラスと同様)を迅速に定義することができ、その後、同時プログラミングやspark、flinkなどのフレームワークを学ぶときにもよく使用されます.
    サンプルクラスの定義
    構文フォーマット
    case class     ([var/val]      1:  1,      2:  2,      3:  3)
    
  • メンバー変数を変更する場合はvar
  • を追加できます.
  • デフォルトはvalで、
  • を省略できます.
    例|サンプルクラスの定義
    需要
  • Personサンプルクラスを定義し、名前と年齢メンバー変数
  • を含む
  • サンプルクラスのオブジェクトインスタンス(「張三」、20)を作成し、
  • を印刷します.
    リファレンスコード
    object _01CaseClassDemo {
      case class Person(name:String, age:Int)
    
      def main(args: Array[String]): Unit = {
        val zhangsan = Person("  ", 20)
    
        println(zhangsan)
      }
    }
    

    例|可変メンバー変数
    需要
  • Personサンプルクラスを定義し、名前と年齢メンバー変数
  • を含む
  • サンプルクラスのオブジェクトインスタンス(「張三」,20)
  • を作成する.
  • 枚3を修正した年齢は23歳で、
  • を印刷した.
    リファレンスコード
    object _02CaseClassDemo {
      case class Person(var name:String, var age:Int)
    
      def main(args: Array[String]): Unit = {
        val zhangsan = Person("  ", 20)
    
        zhangsan.age = 23
    
        println(zhangsan)
      }
    }
    

    #サンプルクラスのメソッド
    サンプルクラスを定義すると、コンパイラは次のいくつかの有用な方法を自動的に実現します.
  • applyメソッド
  • toStringメソッド
  • equalsメソッド
  • hashCode方法
  • copyメソッド
  • applyメソッド
    applyメソッドでは、クラス名をすばやく使用してオブジェクトを作成できます.次のコードを参照してください.
    case class CasePerson(name:String, age:Int)
    
    object CaseClassDemo {
      def main(args: Array[String]): Unit = {
        val lisi = CasePerson("  ", 21)
        println(lisi.toString)
      }
    }
    

    toStringメソッド
    toStringはサンプルクラス名(メンバー変数1、メンバー変数2、メンバー変数3...)を返し、サンプルクラスのメンバーをより詳細に表示できます.
    case class CasePerson(name:String, age:Int)
    
    object CaseClassDemo {
      def main(args: Array[String]): Unit = {
        val lisi = CasePerson("  ", 21)
        println(lisi.toString)
        //   :CasePerson(  ,21)
      }
    }
    

    equalsメソッド
    サンプルクラスはequalsメソッドを自動的に実装し、==を直接使用して2つのサンプルクラスが等しいかどうか、すなわちすべてのメンバー変数が等しいかどうかを比較できます.
  • 名前、年齢
  • を含むサンプルクラスPersonを作成
  • 名前の作成年齢はそれぞれ「李四」で、21の2つのオブジェクトは
  • です.
  • それらが等しいかどうかを比較する
  • val lisi1 = CasePerson("  ", 21)
    val lisi2 = CasePerson("  ", 21)
    println(lisi1 == lisi2)
    //   :true
    

    hashCodeメソッド
    サンプルクラスはhashCodeメソッドを自動的に実装し、すべてのメンバー変数の値が同じであればhash値は同じであり、1つが異なる限りhash値は異なる.
  • 名前の作成年齢はそれぞれ「李四」で、21のオブジェクトは
  • です.
  • 名前の年齢がそれぞれ「李四」、22のオブジェクト
  • を作成します.
  • は、2つのオブジェクトのハッシュ値
  • をそれぞれ印刷する
    val lisi1 = CasePerson("  ", 21)
    val lisi2 = CasePerson("  ", 22)
    
    println(lisi1.hashCode())
    println(lisi2.hashCode())
    

    copyメソッド
    サンプルクラスはcopyメソッドを実装し、同じインスタンスオブジェクトをすばやく作成し、名前付きパラメータを使用してメンバーに再割り当てできます.
  • 名前の作成年齢はそれぞれ「李四」で、21のオブジェクトは
  • です.
  • copyコピーで「王五」という名前のオブジェクト
  • val lisi1 = CasePerson("  ", 21)
    
    val wangwu = lisi1.copy(name="  ")
    println(wangwu)
    

    サンプルオブジェクト
    主に2つの場所で使用されます.
  • 定義列挙
  • は、パラメータのないメッセージング(後述Akkaプログラミング)
  • として機能する.
    定義#テイギ#
    case objectを使用して、サンプルオブジェクトを作成します.サンプルオブジェクトは単一のインスタンスであり、プライマリコンストラクタはありません.
    構文フォーマット
    case object      
    

    例|列挙の定義
    需要説明
  • は、2つのインスタンス(男性-Male、女性-Female)
  • しかない性別Sex列挙を定義する.
  • Personクラスを作成します.2人のメンバー(名前、性別)
  • です.
  • Personオブジェクト(「張三」、男性)、(「李四」、「女」)
  • を2つ作成
    リファレンスコード
    trait Sex /*        */
    case object Male extends Sex		//             Sex  
    case object Female extends Sex		
    
    case class Person(name:String, sex:Sex)
    
    object CaseClassDemo {
      def main(args: Array[String]): Unit = {
        val zhangsan = Person("  ", Male)
    
        println(zhangsan)
      }
    }
    

    #パターンマッチング
    scalaには非常に強力なモードマッチングメカニズムがあり、多くのシーンに適用できます.
  • switch文
  • タイプクエリー
  • モードマッチングによるデータの高速取得
  • 単純モードマッチング
    Javaではswitchキーワードがありif条件判断文を簡略化できます.scalaでは、match式を使用して置き換えることができます.
    構文フォーマット
       match {
        case "  1" =>    1
        case "  2" =>    2
        case "  3" =>    3
        case _ =>    4		//     
    }
    


    需要説明
  • コンソールから単語を入力(StdIn.readLineメソッドを使用)
  • この単語が以下の単語に一致するか否かを判断し、一致できれば一言
  • を返す.
  • 印刷この文
  • 単語
    戻る
    hadoop
    ビッグデータ分散型ストレージとコンピューティングフレームワーク
    zookeeper
    ビッグデータ分散協調サービスフレームワーク
    spark
    ビッグデータ分散メモリ計算フレームワーク
    一致しない
    一致しない
    リファレンスコード
    println("      :")
    // StdIn.readLine            
    val name = StdIn.readLine()
    
    val result = name match {
        case "hadoop" => "             "
        case "zookeeper" => "            "
        case "spark" => "            "
        case _ => "   "
    }
    
    println(result)
    

    #照合タイプ
    Javaのswitchマッチングデータのように、match式はタイプマッチングを行うこともできます.異なるデータ型に基づいて異なる論理を実行する場合は、match式を使用して実装することもできます.
    定義#テイギ#
    構文フォーマット
       match {
        case   1   :   1 =>    1
        case   2   :   2 =>    2
        case   3   :   3 =>    3
        ...
        case _ =>    4
    }
    


    需要説明
  • は、Anyタイプの変数を定義し、hadoop、1、1.0
  • にそれぞれ割り当てます.
  • は、パターンマッチングを定義し、それぞれタイプの名前
  • を印刷する.
    リファレンスコード
    val a:Any = "hadoop"
    
    val result = a match {
        case _:String => "String"
        case _:Int => "Int"
        case _:Double => "Double"
    }
    
    println(result)
    

    [!NOTE]
    case式で一致する変数を使用する必要がない場合は、下線の代わりに下線を使用します.
    ガード
    Javaでは、0-7に一致するには8つのcase文を書く必要があるなど、複数のcaseラベルを簡単に追加するしかありません.例:
    int a = 0;
    switch(a) {
        case 0: a += 1;
        case 1: a += 1;
        case 2: a += 1;
        case 3: a += 1;
        case 4: a += 2;
        case 5: a += 2;
        case 6: a += 2;
        case 7: a += 2;
        default: a = 0;
    }
    

    scalaでは、ガードを使用して上記のコードを簡略化することができます.すなわち、case文にif条件判断を追加します.

    需要説明
  • コンソールから1つの数字a(StdIn.readIntを使用)
  • を読み込む
  • a>=0かつa<=3の場合、[0-3]
  • を印刷する.
  • a>=4かつa<=8の場合、[3,8]
  • を印刷する.
  • それ以外の場合、印刷は
  • に一致しません.
    リファレンスコード
    val a = StdIn.readInt()
    
    a match {
        case _ if a >= 0 && a <= 3 => println("[0-3]")
        case _ if a >= 4 && a <= 8 => println("[3-8]")
        case _ => println("   ")
    }
    

    #照合サンプルクラス
    scalaは、パターンマッチングを使用してサンプルクラスをマッチングすることができ、サンプルクラスのメンバーデータを迅速に取得することができます.その後、Akkaのケースを開発する際にも使用します.

    需要説明
  • 2 2 2つのサンプルクラスCustomer、Orderを作成
  • Customer名前、年齢フィールド
  • を含む
  • Orderはidフィールド
  • を含む
  • は、それぞれ2つのケースクラスのオブジェクトを定義し、Anyタイプ
  • として指定する.
  • は、モードを使用して2つのオブジェクトをマッチングし、それぞれのメンバー変数値
  • を印刷する.
    リファレンスコード
    // 1.        
    case class Person(name:String, age:Int)
    case class Order(id:String)
    
    def main(args: Array[String]): Unit = {
        // 2.        ,    Any  
        val zhangsan:Any = Person("  ", 20)
        val order1:Any = Order("001")
    
        // 3.   match...case          
        //           
        order1 match {
            case Person(name, age) => println(s"  :${name}   :${age}")
            case Order(id1) => println(s"ID :${id1}")
            case _ => println("   ")
        }
    }
    

    一致セット
    scalaのモードマッチングは、集合をマッチングするためにも使用されます.
    マッチング配列
    例の説明
  • コード定義を順次修正する次の3つの配列
    Array(1,x,y)   //  1  ,          
    Array(0)	   //      0     
    Array(0, ...)  //       ,   0  
    
  • .
  • 上記配列
  • にパターンマッチングを用いる.
    リファレンスコード
    val arr = Array(1, 3, 5)
    arr match {
        case Array(1, x, y) => println(x + " " + y)
        case Array(0) => println("only 0")
        case Array(0, _*) => println("0 ...")
        case _ => println("something else")
    }
    

    一致リスト
    例の説明
  • コード定義を順次修正する以下の3つのリスト
    List(0)				//    0       
    List(0,...)   		//  0     ,     
    List(x,y)	   		//             
    
  • .
  • 上記リスト
  • にパターンマッチングを用いる.
    リファレンスコード
    val list = List(0, 1, 2)
    
    list match {
        case 0 :: Nil => println("  0   ")
        case 0 :: tail => println("0     ")
        case x :: y :: Nil => println(s"       ${x}, ${y}   ")
        case _ => println("   ")
    }
    

    メタグループの一致
    例の説明
  • コード定義を順次修正する2つのタプル
    (1, x, y)		//  1   、         
    (x, y, 5)   //        ,       5   
    
  • .
  • は、上記要素
  • にパターンマッチングを用いる.
    リファレンスコード
    val tuple = (2, 2, 5)
    
    tuple match {
        case (1, x, y) => println(s"    ,1     :1, ${x}, ${y}")
        case (x, y, 5) => println(s"    ,5     :${x}, ${y}, 5")
        case _ => println("   ")
    }
    

    #変数宣言のパターンマッチング
    変数を定義するときは、パターンマッチングを使用してデータをすばやく取得できます.
    例|配列内の要素の取得
    需要説明
  • は0-10の数字を含む配列を生成し、パターンマッチングを用いて2番目、3番目、4番目の要素
  • をそれぞれ取得する.
    リファレンスコード
    val array = (1 to 10).toArray
    val Array(_, x, y, z, _*) = array
    
    println(x, y, z)
    

    例|Listのデータ取得
    需要説明
  • は0-10の数字を含むリストを生成し、パターンマッチングを用いてそれぞれ第1、第2の要素
  • を取得する.
    リファレンスコード
    val list = (1 to 10).toList
    val x :: y :: tail = list
    
    println(x, y)