2017-07-21 10 views
0

私は私の知る限り理解するように、このコードScalaは評価

val stream = Stream.continually(1) 
val s = stream.take(10).map(i => { 
    throw new RuntimeException 
    i 
}) 

があるとストリームストリームSにおいて対応する要素にアクセスするとき、マッピングするために渡された関数が評価されます。 sが反復されず、要素にアクセスすることがない場合、例外がスローされるのはなぜですか?

これが初めて評価され

答えて

2

の最初の要素10は常に評価されます。

これは常にスローされます。

val stream = Stream.iterate(0)(_ + 1) 
val s = stream.take(10).map(i => { 
    if (i == 0) throw new RuntimeException 
    i 
}) 

しかし、これはs(1)が参照されるまで実行されません。

val stream = Stream.iterate(0)(_ + 1) 
val s = stream.take(10).map(i => { 
    if (i > 0) throw new RuntimeException 
    i 
}) 
0

scala> val stream = Stream.continually(1) 
stream: scala.collection.immutable.Stream[Int] = Stream(1, ?) 

scala> val newStream = stream.take(10).zipWithIndex.map{case (value, index) => { println(s"processing ${index}"); value * 2 } } 
processing 0 
newStream: scala.collection.immutable.Stream[Int] = Stream(2, ?) 

ので、そのチェックを追加するだけではないに最初で初めて

scala> val newStream = stream.take(10).zipWithIndex.map{case (value, index) => { println(s"processing ${index}"); throw new Exception; value * 2 } } 
processing 0 
java.lang.Exception 
    at .$anonfun$newStream$1(<console>:12) 
    at .$anonfun$newStream$1$adapted(<console>:12) 
    at scala.collection.immutable.Stream.map(Stream.scala:415) 
    ... 29 elided 

あなたが確認することができますを評価するために、あなたのケースで例外がスローされます時間は以下の通り

scala> val newStream = stream.take(10).zipWithIndex.map{case (value, index) => { println(s"processing ${index}"); if(index > 0) throw new Exception; value * 2 } } 
processing 0 
newStream: scala.collection.immutable.Stream[Int] = Stream(2, ?)