Scala Grundkurs

Listenoperationen

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Auf Listen können über die Elemente hinweg diverse Operationen durchgeführt werden, um so eine herkömmliche Herangehensweise wie zum Beispiel for-Loops zu vermeiden. Sehen Sie in diesem Film, welche Möglichkeiten Sie haben, solche Funktionen anzuwenden.

Transkript

Funktionale Programmiersprachen können besonders dann glänzen, wenn man beispielsweise Operationen auf Listen durchführen möchte. Schließlich können Sie entgegen anderer Programmiersprachen wie beispielsweise Java automatisch Funktionen auf jedes Element dieser Liste anwenden und dadurch deutlich einfachere Auswertungen als mit regulären for-Loops generieren. Das ist zum einen deutlich übersichtlicher und zum anderen deutlich einfacher. Daher werde ich Ihnen nun zeigen, welche Möglichkeiten Sie beispielhaft haben, auf Listen solche Funktionen anzuwenden. Dafür beginne ich nun innerhalb meiner Anwendung, Hier habe ich nun drei Produkte. Diese haben einen Preis und einen Namen. Ich füge diese Produkte nun in eine Produktliste hinzu. Nichts leichter als das, mithilfe des Konstruktes List und den Elementen product1, product2 und product3. Das einfachste, was ich an dieser Stelle tun könnte, wäre beispielsweise, den Namen dieser Produkte zu extrahieren und in einer eigenen Liste zusamnenzufassen. Diese Liste nenne ich also Namelist. Ich beginne bei meiner ursprünglichen Produktliste und mithilfe der MappingMethode() kann ich nun ein solches Feld aus dem Produkt extrahieren. Aktuell ist der Name des Produktes nicht sichtbar. Daher mache ich den Namen sichtbar, indem ich die Konstante val name daraus definiere. Weiterhin verwende ich nun hier, wie bei einer Closurer üblich, den Platzhalter und übernehme das Feld Name. Als nächstes kann ich meine Liste von Namen nun auf die Konsole ausgeben und bekomme das gewünschte Ergebnis. Allerdings kann ich mit solchen Listen noch deutlich mehr anstellen. Beispielsweise könnte ich mir alle Produkte mit einem Preis unter 400 € geben lassen. Ich nenne also diese Liste productsBelow400Euro Und beginne also wiederum von meiner Produktliste, filtere diese nun anhand ihres Preises und dort konkret des Wertes und dieser soll nun unterhalb von 400 sein. Nun kann ich beispielsweise mir auch von all diesen Produkten noch einmal den Namen ausgeben lassen, Genauso könnte ich mir nun von diesen Produkten das Teuerste aussuchen. Dafür verwende ich den Aufruf maxBy An der Stelle gilt es nun zu definieren, welches Feld dafür benutzt werden soll, um herauszufinden, was der höchste Wert ist. Ich suche also nun das teuerste Produkt, deswegen verwende ich Undersore für das Produkt, dort dann den Preis und mit Preis und Value, damit den konkreten Preis als Zahl. Und konkret interessiere mich nun für den Namen des teuersten Produktes. Standardmäßig sind solche Scala Listen nicht Lazy. Das bedeutet, dass jeder Aufruf, wie beispielsweise der Aufruf von Filter, sofort ausgewertet wird und dass bei Folgeaurufen quasi immer dann bereits der Inhalt genutzt werden kann von den gefilterten Produkten. Alternativ könnte man das Ganze Lazy gestalten. Lazy bedeutet also, dass das Filterprädikat nur dann ausgewertet wird, wenn infolge ein anderer Punkt tatsächlich den Wert braucht. Das Ganze kann man messen Die Dauer also dieser Auswertungen errechnet sich aus der Endzeit minus der Startzeit. Im Normalfall dauert das Ganze also 3 ms. Das liegt vor allem daran, dass die Auswertung des Prädikats hier bereits einmal stattgefunden hat und alle Folgeaufrufe diese Auswertung nicht mehr tun müssen. Wenn ich nun eine solche Liste in einen Stream umwandle, sind alle Aufrufe, die darauf folgenden, Lazy. Das bedeutet, dass sie jedes Mal neu ausgewertet werden, wenn tatsächlich jemand den Inhalt abruft, wie beispielsweise die Funktion println. Die Dauer ist also nun 6 ms, da das Prädikat zweimal ausgewertet werden muss. Selbstverständlich kann ich nun mit solchen Lazy-Listen arbeiten, aber zu einem gewissen Zeitpunkt kann es sein, dass ich möchte, dass hier Optimierungen stattfinden, so dass zum Beispiel alle Folgeaufrufe nach dem Filter immer bereits die Auswertung nutzen können. Dies kann ich dann beispielsweise tun, indem ich das Ganze wiederum in eine Liste konvertiere. Damit wird also das Prädikat zu diesem Zeitpunkt bereits ausgewertet. Und schon ist die Auswertungszeit wieder auf 3 ms. Eine weitere Möglichkeit, die ich mit Listen habe, ist Partitionierung. Aktuell habe ich also nach Produkten gefiltert, die weniger als 400 € kosten. Doch was sind die Produkte, die mehr als 400 € kosten? Mithilfe des Aufrufes partition prüfe ich nun also das gleiche Prädikat, ob etwas weniger als 400 € kostet. Allerdings bekomme ich nun zwei Listen als Ergebnis. Die erste der beiden Listen stimmt mit der Bedingung überein. Es handelt sich also hier um die Produkte, die unter 400 € sind. Innerhalb der zweiten Liste, sind nun die Produkte, die über 400 € sind. Das Ganze gebe ich nun noch einmal auf die Konsole aus und sehe also, dass das iPad Pro mehr als 400 € kostet, und die Nintendo Switch und das Galaxy S6 weniger als 400 €. Oftmals interessiert man sich auch nur für ein bestimmtes Element in einer Liste. Meistens für das erste, das einem bestimmten Prädikat entspricht. Für diesen Fall verwendet man im Normalfall die Funktion Find. Damit kann ich also nun nach einem Produkt suchen, das genau mit meinem Kriterium übereinstimmt. Beispielsweise könnte ich nun auf Basis des Namens mit einer Regular Expression nach einem Produkt suchen, das in seinem Namen Nintendo enthält. Das Besondere an einem Aufruf von Find ist, dass es ein Option zurückgibt, da ja zu dem Zeitpunkt nicht klar ist, ob es tatsächlich ein Element in dieser Liste gibt, das diese Kriterien erfüllt. Das heißt, ähnlich wie man mit einem Option umgeht, muss ich nun überprüfen, ob das Ganze existiert und notfalls auch einen Fallback angeben. Ich überprüfe und lediglich, ob dieses Element existiert. Eine der häufigsten Operationen, die im Zusammenhang mit Listen stattfindet, ist die Verarbeitung der Listen insofern sie ausgewertet worden sind. Das bedeutet also, wie in einem for-Loop kann ich nun mit einer solchen Liste arbeiten, beispielsweise nun mit den Produkten, die unterhalb von 400 € liegen und für ein jedes dieser Produkte kann ich nun beispielsweise eine Konsolenausgabe machen. Angefangen habe ich also damit, Ihnen die Funktion Map vorzustellen. Dabei werden die Elemente einer Liste verändert und jedes der Elemente steht dann in der neuen Fassung als neue Liste zur Verfügung. Mithilfe der Filter oder auch filterNot Funktion bin ich in der Lage, bestimmte Elemente einer Liste herauszufiltern. Das Problem natürlich hier ist, dass die Elemente, die herausgefiltert worden sind, für mich in dem Moment nicht mehr sichtbar sind. Dafür kann ich beispielsweise Partition verwenden. Damit kann ich die Liste also nun in zwei Bereiche segmentieren, solche Elemente, die meine Bedingungen erfüllen und solche die es nicht tun. Interessiere ich mich nur für ein bestimmtes Element, so kann ich die Find Operation nutzen. Und insofern ich dann alle meine Elemente gesammelt habe, kann ich diese mit forEach auch endgültig auswerten.

Scala Grundkurs

Entdecken Sie die Möglichkeiten und Eigenschaften der modernen Programmiersprache Scala.

4 Std. 44 min (39 Videos)
Derzeit sind keine Feedbacks vorhanden...
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:12.04.2017

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!