2017-09-06 6 views
2

Der folgende Code erstellt eine temporäre Vector:Karte Bereich direkt an Array

0.to(15).map(f).toArray 
^^^^^^^^ 
Sequence 
^^^^^^^^^^^^^^^ 
    temp Vector 
^^^^^^^^^^^^^^^^^^^^^^^ 
        Array 

Der folgende Code erstellt eine temporäre Array:

0.to(15).toArray.map(f) 
^^^^^^^^ 
Sequence 
^^^^^^^^^^^^^^^ 
    temp Array 
^^^^^^^^^^^^^^^^^^^^^^^ 
        Array 

Gibt es eine Möglichkeit f über die Sequenz zu erfassen und direkt ein Array bekommen, ohne ein temporäres zu produzieren?

Antwort

4

können Sie breakOut verwenden:

val res: Array[Int] = 0.to(15).map(f)(scala.collection.breakOut) 

oder

0.to(15).map[Int, Array[Int]](f)(scala.collection.breakOut) 

oder view verwenden:

0.to(15).view.map(f).to[Array] 

this document Siehe für weitere Details über Ansichten.

+1

Können Sie kurz erklären, was 'breakOut' macht? – fredoverflow

+0

Es scheint auch '0.to (15) .map [Int, Array [Int]] (f)' funktioniert bereits ohne die zusätzliche '(scala.collection.breakOut)' Parameterliste. – fredoverflow

+0

Kurz gesagt, 'breakOut' ist eine Methode, die die richtige 'CanBuildFrom'-Instanz basierend auf dem gewünschten Eingabe- und Ausgabetyp findet, die der Compiler sonst möglicherweise nicht richtig ableiten kann. Mit der rechten "CanBuildFrom" -Instanz können Sie einen neuen Sammlertyp erstellen, während Sie über die ursprüngliche Sammlung mappen. Weitere Details unter https://stackoverflow.com/questions/1715681/scala-2-8-breakout –

1
(0 to 15).iterator.map(f).toArray