Scala elegantes Listenverständnis wie in F #

8

Einfaches Verwenden der grundlegenden JDBC-Schnittstelle, um einige Daten mit Scala zu lesen. In F # (mit dem System.Data.SqlClient-Namespace) könnten wir so etwas tun, um eine unveränderbare Liste von der Datenbank zurückzugeben.

%Vor%

In Scala erweist sich das als schwieriger, soweit ich weiß, gibt es kein "während" Verständnis wie F #. Effektiv möchte ich etwas in der Nähe von F # in Scala tun, ohne veränderbare Vars verwenden zu müssen - und sei es nur, weil sie hässlich aussehen und Codezeilen hinzufügen.

So etwas scheint in meinem Scala-Code jetzt üblich zu sein:

%Vor%     
Richard Todd 24.06.2013, 13:26
quelle

3 Antworten

9

Ich würde eine benutzerdefinierte Unterklasse von Iterator erstellen, die ein Abfrageergebnis umschließt. Es ist wirklich einfach; senia hat gezeigt, wie.

Aber du könntest auch

%Vor%     
Rex Kerr 24.06.2013, 14:26
quelle
7

Du könntest den gleichen Weg in Scala benutzen, aber ich finde es hässlich:

%Vor%

Idiomatische Scala-Methode ist die Konvertierung von Reader in Iterator :

%Vor%

Aber wenn Sie diese Syntax wirklich vermissen, können Sie sie hinzufügen:

%Vor%     
senia 24.06.2013 14:17
quelle
5

Sie könnten eine implizite Klasse zusammen mit einer impliziten CanBuildFrom verwenden. Dies verwendet einen veränderbaren Builder, aber nicht auf der Seite des Aufrufers:

%Vor%

wird wie folgt verwendet:

%Vor%

Das für das Verständnis verwendet map unter der Haube, also wenn Sie map direkt bevorzugen:

%Vor%

was eine Sequenz erzeugt. Dank CanBuildFrom können Sie auch andere Sammlungen erstellen, indem Sie einen Typ explizit angeben:

%Vor%

Wie funktioniert CanBuildFrom ? Der Scala-Compiler untersucht die Typen, die an diesem Ausdruck beteiligt sind: Es gibt den resultierenden Typ und den Typ, der von der von map aufgerufenen Funktion zurückgegeben wird. Basierend auf diesen Informationen stellt der Scala-Compiler implizit eine Factory bereit, mit der ein geeigneter Builder erstellt werden kann. Sie benötigen also nur eine Methode, um verschiedene Arten von Sammlungen zu erstellen.

Wenn Sie mehrere Werte zurückgeben möchten, geben Sie einfach ein Tupel zurück:

%Vor%

und das Tupel kann verwendet werden, um direkt ein Map zu erstellen:

%Vor%

Dies basiert auf der Idee, dass eine Ergebnismenge eine Liste von Zeilen ist und daher die Funktion map darüber verfügbar sein sollte. Die implizite Klasse wird verwendet, um die map -Methode implizit der zugrunde liegenden Ergebnismenge hinzuzufügen.

    
Beryllium 24.06.2013 14:54
quelle

Tags und Links