私は現在scalaを学んでいます。私はせっかちな人のために Scala を読んでいます。
1.)
警備員
違いはありますか?
for (i <- 0 to 10)if (i % 2 == 0) println(i)
for (i <- 0 to 10 if i % 2 == 0) println(i)
2.)
私はいつも次の記号を見ます=>
が、それが何をするのか説明していません。
キャストだと思うこともあるけど、全然違うものだと思うので、解明していただければ幸いです。
私は現在scalaを学んでいます。私はせっかちな人のために Scala を読んでいます。
1.)
警備員
違いはありますか?
for (i <- 0 to 10)if (i % 2 == 0) println(i)
for (i <- 0 to 10 if i % 2 == 0) println(i)
2.)
私はいつも次の記号を見ます=>
が、それが何をするのか説明していません。
キャストだと思うこともあるけど、全然違うものだと思うので、解明していただければ幸いです。
1.) はい、違いがあります。最初if
に、クロージャー内の通常のステートメントを for-comprehension に渡します。2番目は実際の警備員です。を呼び出す前に、実際にwithFilter
範囲を呼び出しforeach
ます。したがって、2 つのことを翻訳すると、次のようになります。
0.to(10).foreach(i => if(i % 2 == 0) println(i) )
0.to(10).withFilter(x => x % 2 == 0).foreach(i => println(i))
もう少しコンテキストを追加するには、通常の if ステートメントを使用する代わりにwithFilter
or を呼び出すだけでもいくつかの利点があります。filter
for 内包表記では、map、flatmap、filter、collect などのネストされた呼び出しを使用できるため、ガードを追加すると、多くの af 呼び出しが実際に発生するのを防ぐことができます。例えば:
for {
x <- 0 until 10
y <- 10 until 20
} {
if(x % 2 == 0) println(x*y)
}
実際の閉鎖を100回呼び出す
for {
x <- 0 until 10
if x % 2 == 0
y <- 10 until 20
} println(x*y)
結果は同じままですが、これは50回しか呼び出されません。
2.)
=>
関数/クロージャの引数リストを本体から分離します。
これcase e: NumberFormatException => None
は部分関数の一部です。ここで=>
、「引数」e
が body から分離されNone
ます。
のような型シグネチャでは、それが型でsomeFunction(i: (A) => Int)
あることを意味します。i
Function1[A,Int]
A
Int