2012-02-24 16 views
13

¿Está foreach by-definition garantizado para iterar la colección sujeto (si define orden) secuencialmente desde el primer hasta el último elemento (a menos que se interrumpa accidentalmente)? ¿No hay ningún conmutador de optimización del compilador que pueda frenarlo (barajar la secuencia) o planea hacer que el foreach ordinario sea paralelo en futuras versiones?¿Está garantizada la definición por definición de foreach para iterar secuencialmente la colección sujeto en Scala?

Respuesta

14

Foreach se garantiza que sea secuencial para las colecciones secuenciales (es decir, la jerarquía normal, o para cualquier cosa transformada por .seq). La parte paralela de la biblioteca de colecciones (que se obtiene de una colección estándar a través de .par o mediante el uso explícito de clases desde collection.parallel) está prácticamente garantizada no para evaluar en orden. Si quieres ser agnóstico, puedes usar el conjunto de rasgos GenX (por ejemplo, GenSeq); estos no proporcionan ninguna garantía en el orden de ejecución o que el trabajo se realizará en paralelo.

2

Para complementar la respuesta de Rex, foreach en GenTraversableOnce solo garantiza que se iterarán todos los elementos, a menos que lo interrumpa. Rasgos más bajos en la cadena de jerarquía pueden ofrecer garantías adicionales, por ejemplo:

  • TraversableOnce y descendientes garantizar que sólo un elemento se itera a través a la vez (no garantizada por GenTraversableOnce!).
  • Seq y los descendientes garantizan que los elementos se recorrerán en el orden en que se mantienen en la colección.

Y ya que lo preguntas acerca paralelo foreach ...

scala> (1 to 10).par foreach println 
4 
6 
1 
3 
2 
7 
5 
8 
9 
10 
Cuestiones relacionadas