ホームページ  >  記事  >  Java  >  Java Scala でのパターン マッチングと暗黙的変換の方法は何ですか?

Java Scala でのパターン マッチングと暗黙的変換の方法は何ですか?

WBOY
WBOY転載
2023-05-12 19:25:041066ブラウズ

    パターン マッチング:

    Scala のパターン マッチングは Java の switch と同等です

    Java では次のようになります。 switch と casedefault で構成される基本構文。Scala では match と case があります。default の役割は case に置き換えられます。

    基本構文は次のとおりです:

    val a=10
        val b=20
        var c='+'
        c match {
          case '+'=> println(a+b)
          case '-'=> println(a-b)
          case _  =>println("错误的运算符")
        }

    Scala ではデフォルトでは、

    case _ はこのケースから次のケースまで実行されます。これは、上記のどの状況も満たされないことを意味します。特定の範囲に一致するデータを表現したい場合、パターンマッチングに条件ガードを追加する必要があります

    (実際にはcaseのif判定を追加します)

     val x=3.153
        val value: Any = x match {
          case i: Double if i >= 0 => i
          case j: Double if j < 0 => -j
          case _ => "type illegal"
        }

    型マッチング:

    関数を定義する場合、パラメータはすべてオブジェクトです 親クラス Any

     def function(x:Any): Unit ={
          x match {
            case s:String =>println("字符串")
            case i:Int=>println("整数")
            case d:Double=>println("小数")
            case _ =>println("其他")
          }
        }

    オブジェクトのマッチング

    オブジェクトのマッチングはより複雑です。単純な比較はアドレス値の比較です。アドレス値2 つの変数は明らかに異なります

    object Test_03MatchObject {
      def main(args: Array[String]): Unit = {
        val sss: person1 = person1("sss", 1)
      sss match {
        case person1("sss",1)=>println("victory")
        case _=>println("defite")
      }
      }
      class person1(val name: String,val age :Int){
      }
      object person1{
        def apply(name: String, age: Int): person1 = new person1(name, age)
        def unapply(arg: person1): Option[(String, Int)] =
          if (arg==null)
          {
            None
          }
          else{
            Some(arg.name,arg.age)
          }  }
    }

    ここでは、オブジェクト内に unapply メソッドを定義します。unapply メソッドは、apply メソッドの逆の適用に相当します。apply メソッドは、オブジェクト内にオブジェクトを作成します。 unapply メソッドは、操作のオブジェクトを抽出する抽出メソッドです (受信パラメータがオブジェクトです。オブジェクトに従ってデータを抽出して Some に格納し、独自の受信データと比較します)。このメソッドも同様です。 applyメソッドと同様にメソッド名を記述する必要があります。

    このメソッドは主にオブジェクト (一致するオブジェクト) を解析するために使用されます

    サンプル クラス:

    サンプル クラスの main 属性のデフォルトは val です。var を使用する必要がある場合は、マーク

    サンプル クラスは、una​​pply や apply などのメソッドを自動的に生成し、多くのコードを節約します

    上記のクラスとオブジェクトをコメントして、新しいサンプルを作成しますクラス: (大量に使用されます)

      case class person1(val name: String,val age :Int)

    部分関数:

    部分関数の省略形:

    collect 関数を直接呼び出して部分関数のパラメーターを呼び出し、直接呼び出すことができます。必要な操作

    省略方法は一致を省略するのと同等で、効果はフィルターマップと同等です

    部分関数は、を使用するシナリオでも使用できます。マップ

    部分関数の使用:

        val list = List(List(1, 2, 3, 4), List(1), List(8, 5))
        val list1: List[Int] = list.collect({ case List(x, y, _*) => y })
      println(list1)

    暗黙の変換:

    公式定義:

    コンパイラが初めてコンパイルに失敗したとき、

    を使用して、現在の環境でコードを正常にコンパイルできるメソッドを検索します。

    二次コンパイルを行うために型を変換するために使用されます。

    個人的な理解:

    暗黙的な変換は関数が配置されているクラスにないオブジェクトの関数を呼び出すときにエラーが発生したときに実行する操作

    暗黙的な関数:

    暗黙的な変換ステップ:

    (1) 以下のターゲット クラスを定義し、そのクラス内で呼び出されるメソッドとロジックを定義する必要があります

    例: Int 型データに対して存在しないメソッドを呼び出します:

    class MyRichInt(val self :Int)
      {
    def myMax(int: Int):Int =
        {
          if (int>self)
            int
            else
            self
        }
      }

    (2) メイン関数内でコンバータを定義

    導入 ---- 先頭で暗黙的 次に暗黙的変換関数を定義します

     implicit def changeInt(self:Int)  =
        {
    new MyRichInt(self)
        }

    暗黙的変換方法が同じで競合する場合独自のメソッド、独自のメソッドが使用されます (コンパイルが失敗しないため -- 暗黙的変換の公式定義)

    暗黙的パラメーター:

    デフォルトのパラメーター値は、次の場合にすでにわかっています。関数を定義しますが、呼び出すときにかっこを追加する必要があります。

    ここで新しい概念を紹介します。暗黙的なパラメーター

    パラメーターの比較例:

       implicit val name:String="lisi"
        def sayhi(implicit name: String="sd"): Unit =
        {
          println(s"hi $name")
        }
       sayhi
       sayhi()
    パラメーターのデフォルト値呼び出し関数の後に括弧を追加するだけです。

    実行結果:

    Java Scala でのパターン マッチングと暗黙的変換の方法は何ですか?暗黙的クラス:

    キーワード implicit を前に追加します。通常のクラスであり、自動的に暗黙的クラスに変換されます。

    暗黙的変換の対象クラスが暗黙的クラスに変換される場合、メインで新しい暗黙的クラスを作成する必要がない場合は、 function

    、指定した関数

    を直接呼び出すことができます。

    以上がJava Scala でのパターン マッチングと暗黙的変換の方法は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。