大規模なデータチュートリアルシリーズScalaのパターンマッチング、およびサンプル・クラスを共有するのが良いプログラマ

大規模なデータチュートリアルシリーズScalaのパターンマッチングを共有し、サンプル・クラスには良いプログラマ
1.サンプル・クラスを
Scalaのサンプルでは、クラスは不変サンプル特別なクラスのクラスですが、
それは使用することができた値と比較することができ、マッチモード。
サンプルクラスの定義:
1 VARとして明示的に宣言しない限り、各コンストラクタのパラメータは、valのある
新しいキーワードは、対応するオブジェクト構築することができるようになります使用しないように、2コンパニオンオブジェクトは、適用を提供
する場合、クラスPoint(xと:のIntは、Y:int)が
サンプルクラスオブジェクトを作成する:
ヴァルポイント=ポイント(1、2)。
ヴァルanotherPointポイント=(1、2)。
ヴァルyetAnotherPointポイント=(2,2)
//アクセス目標値
point.xの
ポイント。 X = 1 //ができない
ことにより、クラスオブジェクトのサンプル値を比較:
{(== anotherPointポイント)IF
(「同一である」点+「及び」+ + anotherPoint)のprintln
} {他
のprintln(+ポイント」そして"+ + anotherPoint"が異なっている。「)
}
//同一のポイント(1,2)と点(1,2)。

IF(点== yetAnotherPoint){
のprintln(点+ "及び" + yetAnotherPoint + "と同じである。")
} {他
のprintln(点+ "及び" + yetAnotherPoint + "異なる")
}
//ポイント(1 、2)和ポイント(2,2)是不同的。
样例类的拷贝
あなたは、単にコピー方法を使用してケースクラスのインスタンスの(浅い)コピーを作成することができます。オプションで、コンストラクタの引数を変更することができます。
ケース・クラス・メッセージ(送信者:文字列、受信者:文字列、身体:String)を
ヴァルmessage4 =メッセージ( "[email protected]"、 "[email protected]"、 "私ZO O komzガントミリアンペアamezeg")
ヴァルmessage5 = message4.copy(送信者= message4.recipient、受信者= "[email protected]")
message5.sender //トラヴィスワシントン@。

message5.body //「私ZO O komzガントミリアンペアamezeg」
パターンマッチングサンプルクラスで使用される:
抽象クラス量
//二つのサンプル一般的なクラスは、クラス継承
ケースクラスドル(値:ダブル)金額延び
ケースクラスを通貨は、(値:ダブル、単位:文字列)金額拡張
量対象拡張するケースは何も
オブジェクトCaseClassDemoを{

DEFメイン(引数:配列[文字列]):単位= {
ヴァルAMT =新しい新しいドル(10);
patternMatch(AMT)
}
DEF patternMatch(AMT:量){
AMT一致{
ケースドル(V)=>のprintln(「$ "+ V)
ケース通貨(_、U)=> printlnを("ああNOEが、I GOT "+ U)
ケース無し=> printlnを("ナッシング「)//サンプルオブジェクトんではない()
}
}
}
文のサンプルクラス、次のものが自動的に行われます:
1.パターンマッチングに適用解除する方法を提供し作業することができます
。2.のtoStringを生成し、それはこれらの方法で与えられた定義から表示されていない限り、ハッシュコードのコピー方法に等しいです。
2.パターンマッチング
1.ベター・スイッチ
JavaのようでScalaのスイッチコードは:
注意:
Scalaのパターンマッチングは、それが次の分岐に落ちていないので、break文を使用していない、枝に一致します。発現一致であり、式場合、値は:
オブジェクトPatternDemo {

DEFメイン(引数:配列[文字列]):単位= {
VARサイン= 0
ヴァルCH:シャア= 'P'
ヴァルvalchar = 'P'
= 0 VARディジット

//一致式は、
CH {マッチ
。ケース'+' => =記号1
' - 'ケース=>サイン= -1
//使用|分割多重オプション
ケース'*' | 'X' =>サイン= 2
/ /あなたは、変数を使用することができる
場合のキーワードは変数名が続いている場合は、//、表現のマッチはその変数に割り当てられます。
Valchar =ケース>ログイン= 3
//ケースデフォルトでJavaに似た
何パターンが一致しない場合は、//、MacthErrorがスローされます
//モードが守るために追加することができる
ケース
IF Character.isDigit(CH)=>は、Character.digit桁=を( CH、10)
}
のprintln( "サイン=" +サイン)
}

}
1定常モード(一定のパターン)が変数と定数定数はリテラル含ま
スカラ>ヴァルサイト=「Alibaba.com」
スカラを>サイト一致{ケース「Alibaba.com」=>のprintln(「OK」)}
スカラ>ヴァル=アリババ「Alibaba.com」
の定数は大文字で始める必要があり、ここで注意してください//
スカラ>デフfooの(S:文字列 ){sの試合{ケースアリババ=> printlnを(「OK」)}}
定数、通常モードであれば二つのオブジェクトの比較等しい(等しい)は差がありませんし、そこのパワーを感じることは何もありません
2変数モード(変数パターン)
むしろ単純な変数パターンマッチング処理を判断することではないが、しかし、新しい変数名に渡されたオブジェクトから。
スカラ>サイト一致{場合whateverName = >のprintln(whateverName)}
whateverNameと照合する対象のサイト上には、変数名を置き換えるので、常に成功したマッチ。しかし、ここでは、書かれたWhateverNameこのWhateverName変数を見つける場合は、見つかった場合、それ以外の場合は、例えば、上whateverNameとして、一定の変数として扱われます小文字で始まる呼び出し、変数のための規則は、より平等でありエラーを見つけることができません。
可変モードでは、通常、単独で使用されないが、組合せでのようなモード、複数使用した場合
のリスト(1、
Xは、xでマークされたマッチ変数への最初の要素の内側にあります。
3ワイルドカードパターン(ワイルドカードパターン)
ワイルドカードは下線が引かれている:「」は、特定の変数またはプレースホルダとして理解することができます。シンプルなワイルドカードパターンマッチングは通常、最後のラインパターンが発生している、ケース =>それはマッチが成功していない他のすべてのケースを処理するために、任意のオブジェクトに一致します。多くの場合、他のモードと組み合わせて使用されるワイルドカードパターン:
スカラ>リスト(1,2,3)マッチ{ケースリスト(。、3)=>のprintln( "OK")}
(上記のリスト。は、3)2を用いましたワイルドカードと第二の要素を表し、これらの2つの要素は、典型的には一部を表すワイルドカードに使用される任意のタイプであってもよい関心ではない、後続の論理変数で使用することができる可変モードではありません。
4.サンプルクラスが一致する
//クラス定義のサンプル
抽象クラス通知
(:文字列、タイトル:文字列、ボディ:文字列SENDER)通知拡張Emailクラスでケース
ケースクラスSMS通知の拡張(発信者:文字列:文字列、メッセージ)
ケースクラスVoiceRecordingを(CONTACTNAME:文字列、リンク:文字列 )の通知を拡張します

//基于样例类的模式匹配
デフshowNotification(通知:通知):文字列= {
通知マッチ{
ケースメール(電子メール、タイトル、)=>
:S "$タイトルあなたはタイトルで$メールからメールが来た"
場合のSMS (番号、メッセージ)=>
S「あなたは$番号からのSMSを得たメッセージ:!$メッセージ」
の場合VoiceRecording(名前、リンク)=>
s "を使用すると、$名からボイスレコーディングを受け、それを聞くためにリンクをクリックしてください!$リンク」
}
}
ヴァルsomeSms = SMS( "12345"、 "あなたはありますか?")
ヴァルsomeVoiceRecording = VoiceRecording( "トム"、 "voicerecording.org/id/123")
のprintln(showNotification(someSms))//结果:あなたは12345からSMSを持って!メッセージ:あなたはありますか?
println(showNotification(someVoiceRecording))//結果:あなたは、クリックへのリンクでトムからのボイスレコーディングを受信しそれを聞い:! voicerecording.org/id/123
2.警備モード
ブール式や条件式を増加させるための試合よります特定。
showImportantNotification DEF(通知:通知、importantPeopleInfo:配列[文字列]):文字列= {
通知マッチ{
//内容だけimportantPeopleの電子メールリストと一致する
電子メールの場合を(電子メール、
)IF importantPeopleInfo.contains(電子メール)=>
「あなたによって、 GOTからのメール特別な人!「
ケースSMS(ナンバー、
)importantPeopleInfo.contains(ナンバー)=> IF
」あなたによってSMSからは、特別な人だ!」
ケースその他=>
showNotification(その他)//何も特別な、私たちのオリジナルのデリゲート関数showNotification
}
}

ヴァルimportantPeopleInfo =配列( "867から5309"、 "[email protected]")

ヴァルsomeSms = SMS( "867から5309"、 "あなたは?あります")
ヴァルsomeVoiceRecording = VoiceRecording( "トム"、 "voicerecording.org/id/123")
ヴァルimportantEmail =メール( "[email protected]"、 "飲み物今夜?"、 "私は5の後に自由だ!")
のval importantSms = SMS( "867から5309"には、 "私はここよ!どこにいますか")

println(showImportantNotification(someSms、importantPeopleInfo))
のprintln(showImportantNotification(someVoiceRecording、importantPeopleInfo))
のprintln(showImportantNotification(importantEmail、importantPeopleInfo))
のprintln(showImportantNotification(importantSms、importantPeopleInfo))
5マッチングのタイプは
:式の型に一致させることができる
ヴァルARRアレイ=( "HS" ,. 1、2.0、 'A')
ヴァルOBJ = ARR(にRandom.nextInt(4))
のprintln(OBJ)
OBJ一致{
ケースX:のInt =>のprintln(X)
ケースS:文字列=> println(s.toUpperCase)
ケース:ダブル=> printlnを(Int.MaxValue)
ケース
=> 0
}
注:試合中に入力したとき、彼はそうでなければ、オブジェクト自体が一致することになる、変数名を指定する必要があります。
試合{OBJ
ケース:のBigInt => Int.MaxValue //オブジェクトの任意の型を一致のBigInt
場合のBigInt => -1 //クラスのBigIntオブジェクトタイプ一致
}
一致が実行時に発生し、ジェネリック型情報のJava仮想マシンを擦りますアウト。したがって、あなたは、特定のタイプの地図と一致するように入力することはできません。
メートルケース:地図[文字列、INT] => ... //エラー
//一致させることができ、一般的なマッピング
ケースM:地図[
、_] => ... // [OK]を

特殊なケースとして//アレイが、しかし、それが無傷である情報のタイプは、配列[INT]に適合させることができる
配列[INT] => ... // OK:ケースM
3マッチング配列、リスト、タプル
配列一致
ヴァルを= ARR1のアレイ(1,1)
ヴァルRES = {ARR1の一致
ケースアレイ(0)=> "0"
に一致含む// 0アレイ
ケースをアレイ(X、Y)=> S "$ X $ Y"
//一致を2つの要素を持つ任意の配列、および要素は、xとyにバインドされている
場合、配列(0、*)=>「0 ...」
//ゼロの任意の配列と一致する
ケース
=>「何かを」
}
一致のリスト
ヴァルLST一覧=(1,2)
のVal RES2 = {マッチリスト
ケース::無記号0 => "0"
事例X :: Y :: =ナシ> X + "" + Y
ケース::尾0 => 「0 ...」
ケース=>「何か他に」
}
マッチングタプル
VARペア=(1,2)
のVal RES3対マッチ= {
ケース(0、
)=> "0 ..."
ケース(Y、0)=> S "0 $ Y"
ケース_ => "でもない0"
}
4.Sealedカテゴリ(密封されたクラス、代替)
スカラ座、形質とクラスでそのサブクラスのすべてが同じファイルで定義されている必要があり、キーワードの後に変性された変性密封されたキーワードを、変更することができます。
これの利点は次のとおりです。あなたがサンプルクラスをパターンマッチングを使用しないときは、コンパイラは、すべての可能なオプションのリストを持っていることを確認してみましょうことができ、コンパイラは、モデル文の整合性をチェックすることができます。
家具の抽象クラス封印された
ケースクラスソファー()家具の拡張
ケースクラスのチェアを()拡張家具の
//この場合に、すべての種類の一致することができません定義
DEF findPlaceToSit(作品...:家具の):文字列= {マッチピース...
ケースAを:ソファー=> "ソファーリーON「
ケースB:チェア=>」シットが椅子の上にあります"
}

おすすめ

転載: blog.51cto.com/14573321/2444264