- JAVA-C2 | Overview
- JAVA-C2 | Collection Advanced
- JAVA-C2 | Java Concurrent Collections
- JAVA-C2 | Thread-sichere List
- JAVA-C2 | CopyOnWriteArrayList
- JAVA-C2 | Thread-sichere Sets
- JAVA-C2 | CopyOnWriteArraySet (Non-Blocking )
- JAVA-C2 | Thread-sichere Queues
- JAVA-C2 | BlockingQueue
- JAVA-C2 | Thread-sichere Maps
- JAVA-C2 | CopyOnWriteArraySet
- JAVA-C2 | Collections Stream API
- Collection | Aggregation
- Collection | Reduction
- Collection | Stream.collect
- Collection | Parallelism
- Collection | Parallele Computing
- Collection | Collection Streams FAQ
- Collection | Collection Strategies
- Collection | Custom-Collections
- Links
Concurrent Collection Interfaces & Classes Thread-sichere Lists Collection.synchronizedList() CopyOnWriteArrayList (@Bsp?) Thread-sichere Sets Collection.synchronizedSet() CopyOnWriteArraySet Thread-sichere Queues BlockingQueue ArrayBlockingQueue LinkedBlockingQueue PriorityBlockingQueue Nicht-serialisierbare Queues SynchronousQueue DelayQueue Thread-sichere Maps Collection.synchronizedMap(..) ConcurrentHashMap
Aggregate Operations Streams & Aggregate Operations (Overview) @! 15 Page Section Links fehlen! Person ExampleData Aggregate Operations @!section? stream() @!section? for-Loop for-Loop stream() und forEach() Streams und Pipelines Filter und Predicates EXAMPLE 03 Stream/Predicate/Consumer EXAMPLE 04 Consumer mit Generic Type Parameter EXAMPLE 05 Predicates/Enums/Collection "Pipelines" EXAMPLE 06 Mapping to new Type EX6 Summary maptTOInt, ToIntFunction, IntStream.average() OptionalDouble EXAMPLE 07 Map Key-Value-Array zu LinkedHashMap Stream.mapToObj(k,v) collect(Collectors.toMap(a,b,c,d) Map.entry(k,v) map(*).findFirst().orElse(*) Map.getOrDefault(..)
Collection Reduction stream.reduce Collection Collecting Collection stream.collect
@! Kapitel überprüfen! @! Java-Tier von B4 auf B2 verschoben! @! Alle Links/Referenzen checken!
Collection-Parallelism Collection Stream API ab JAVA 8 .parallelStream() .parallelStream() .parallelStream().mapToInt(*).average).getAsDouble() Typ OptionalDouble Begriff Fork Begriff Join Executing Streams in Parallel (01) Concurrent Reduction (02) Ordered Sequentiell (03) Ordered Parallel (04) Side Effects Parallel Computing "Lazyness" (06) Interference (07) State-Full-Lambda Expressions (08) zustandsbehaftete Lambda-Ausdrücke (08)
Collections, Streams & Algorithms Collection Streams (Overview) UIO SimulateDownloadDataProvider** connectSimulated():ListINT Filter (prime, schnapps, quer, mod, Operations filter, map, sorted, collect, reduce, peek, limit
(Collection FAQ) Datenquellen zu Streams konvertieren Array-Stream Collection-Stream Map-Stream Primitive-Stream Generatoren-Stream Iteratoren-Stream (Collection Implementations) (Collection Algorithms)
Overview
JAVA-C2 | Overview
JAVA-C2 | Overview
In diesem Teil JAVA-C2 befassen wir uns als Vertiefung zur Themen der objektorientierten Programmierung in Java mit der Einführung mitunter in das Java Collection Framework. Collection Interfaces und zugehörige Implementierungsklassen werden von allen Java Packages in sehr großem Umfang genutzt.
Collection Advanced
JAVA-C2 | Collection Advanced
Für eine vertiefende Betrachtung und Nutzung von Collections in JAVA wiederholen wir die Einführung in die Core-Collection-Interfaces und die Implementierungsklassen mit einer Erweiterung um weitere Collection-Interfaces und weitere Implementierungsklassen aus dem Bereich java.util.concurrent Package.
Der Weg für Entwickler für bisherige iterative sequentielle Verarbeitung der Werte von Collections zu einer sequentiellen Verarbeitung über Streams über die Stream API ist inzwischen genauso kurz wie der Sprung zur parallelen Verarbeitung über parallelStream(). Nun sind bis auf Ausnahmen die üblichen java.util-Collections nicht synchronisiert. Darüber hinaus werden immer wieder Concurrent Modififaction Exceptions CMEs ausgelöst.
Java Concurrent Collections
JAVA-C2 | Java Concurrent Collections
Das Package java.util.concurrent beinhaltet eine Reihe weiterer Klassen rund um Parallel Computing sowie darüber hinaus aber auch neue Thread-sichere, blockende oder auch nicht-blockende Collections und zugehörige Interfaces.
Mehr Informationen zu Collections siehe Einführung in Collections.
Thread-sichere Lists
JAVA-C2 | Thread-sichere Lists
Für eine Thread-sichere Verwaltung von Daten über Collections gibt es zwei Optionen: Entweder synchronisiert man eine bestehende ArrayList oder andere Liste über Collections.synchronizeList(liste) oder aber man verwendet eine neue Thread-sichere, nicht-blockende CopyOnWriteArraList.
JAVA-C2 | CopyOnWriteArrayList
CopyOnWriteArrayList ist serialisierbar,
NICHT klonbart und non-blocking.
Beim Lesen ist diese List-Variante etwas langsamer. Sie erzeugt hierbei einen «immutable snapshot» und damit eine Kopie aller Daten, so dass es keine Rolle spielt, ob danach die Daten verändert werden. Dieses Erzeugen von Snapshots kostet allerdings Abstriche bei der Performance.
Thread-sichere Set
JAVA-C2 | Thread-sichere Sets
Für eine Thread-sichere Verwaltung Daten in einem Collection-Set
gibt es zwei Optionen: Entweder synchronisiert man eine LinkedList,
ein HashSet, TreeSet oder EnumSet über Collections.synchronizedSet(set)
oder aber man verwendet CopyOnWriteArraySet.
Die synchronisierte Variante ist thread-sicher und blockt bis man etwas hinzufügt oder entfernt.
JAVA-C2 | CopyOnWriteArraySet (Non-Blocking )
Diese Klasse ist Thread-sicher, non-blocking (mutual exclusion), serialisierbar, ermöglicht keinen RandomAccess und ist NICHT cloneable.
Beim Lesen ist diese Set-Variante etwas langsamer. Sie erzeugt hierbei einen «immutable snapshot» und damit eine Kopie aller Daten, so dass es keine Rolle spielt, ob danach die Daten verändert werden. Dieses Erzeugen von Snapshots kostet allerdings Abstriche bei der Performance.
BlockingQueue
JAVA-C2 | BlockingQueue
Die Klassen ArrayBlockingQueue, LinkedBlockingQueue, PriorityBlockingQueue sowie
die zwei nicht serialisierbaren SynchronousBlockingQueue und DelayQueue implementieren
das BlockingQueue
Alle BlockingQueue Klassen liefern Thread-sichere, Instanzen einer Queue, welche solange blocken, bis jemand etwas entnimmt oder hinzufügt.
Thread-sichere Maps
JAVA-C2 | Thread-sichere Maps
Maps aus java.util sind NICHT Thread-sicher, können aber über Collections.synchronizedMap(map)
synchronisiert werden und blocken bis jemand etwas entfernt oder hinzufügt.
Eine nicht-blockende,
Thread-sichere Variante ist die Klasse ConcurrentHashMap.
JAVA-C2 | CopyOnWriteArraySet
Diese Klasse ist Thread-sicher, non-blocking (mutual exclusion), serialisierbar, ermöglicht keinen RandomAccess und ist NICHT cloneable.
Sie benötigt sowohl beim Lesen als auch beim Schreiben etwas mehr Zeit.
Collection & Streams
JAVA-C2 | Collections Stream API
Einführung in sequentielle Streams.
Collections dienen weniger dazu, um irgendwelche Daten zu speichern, als viel mehr, den Zugriff auf Daten zu erlangen, welche in diesen Collections zu finden sind oder über diese gut organisiert werden können. Sogenannte Aggregation Operations dienen dazu, Informationen aus einer Collection zu ermitteln und diese zu einem Ergebnis zusammengefassen, der Aggregation.
Basierend auf der Person-Klasse aus
unser ExampleData-Rubrik geben wir einen Einblick in das Prinzip der
Aggregation-Operations im Zusammenhang mit der Java Collection Stream API
mit deren Hilfe seit Java8/9 alle bisherigen Java Collections aus dem
Java Collection Framework erweitert wurden. In diesem Zusammenhang wurden
auch eine Vielzahl von Funktionalen Interfaces definiert und/oder konsequent
eingesetzt.
Dieses Kapitel setzt dahingehend solide Kenntnisse in Funktionaler Programmierung
sowie die Syntax von Lambda-Expressions voraus.
Aggregation
Collection | Aggregation
Einführung in die Aggregation / Aggregate Streams
Collections dienen weniger dazu, um irgendwelche Daten zu speichern, als viel mehr, den Zugriff auf Daten zu erlangen, welche in diesen Collections zu finden sind oder über diese gut organisiert werden können. Sogenannte Aggregation Operations dienen dazu, Informationen aus einer Collection zu ermitteln und diese zu einem Ergebnis zusammengefassen, der Aggregation.
Basierend auf der Person-Klasse aus
unser ExampleData-Rubrik geben wir einen Einblick in das Prinzip der
Aggregation-Operations im Zusammenhang mit der Java Collection Stream API
mit deren Hilfe seit Java8/9 alle bisherigen Java Collections aus dem
Java Collection Framework erweitert wurden. In diesem Zusammenhang wurden
auch eine Vielzahl von Funktionalen Interfaces definiert und/oder konsequent
eingesetzt.
Dieses Kapitel setzt dahingehend solide Kenntnisse in Funktionaler Programmierung
sowie die Syntax von Lambda-Expressions voraus.
Reduction
Collection | Reduction
Collection Reduction | Overview
Neben den Terminal-Operations wie Aggregate-Operations bietet die Stream-API desweiteren Stream.reduce() sowie Stream.collect().
In diesem Themenblock erläutern wir das Prinzip der
Collection Reduction
über Stream.reduce(..) und Stream.collect(..).
Wir erklären die Reducer-Parmeter identity
und accumulator.
Terminal-Operation
Terminal-Operations average, sum, min, max, count.
Stream.reduce() Methode
Diese Methode ist eine General-Purpose-Methode und ermöglicht
es, dass man sich seinen eigenen Reducer
schreibt.
stream().reduce(identity, accumulator) erwartet zwei Parameter: Der identity-Wert ist der Initialwert für Beginn der Operation und zugleich auch immer der default-Wert in Fällen, wo es gar keine Elemente im Stream gibt.
Der accumulator-Parameter erwartet einen Lambda-Ausruckt mit zwei Parametern T,T und einem Rückgabe-Wert T. Der Akkumulator bekommt über den ersten Parameter den bisherigen Wert und über den zweiten Parameter den neuen Wert aus dem Stream. Als Ergebnis liefert der Akkumulator einen Wert vom selben Typ T welcher für das nächste Element aus dem Stream im nächsten Akkumulator-Schritt wieder der Eingangswert ist.
WICHTIG: Da reduce() mit jedem Schritt eine neue Collection erzeugt, ist es mehr als unwirtschaflich, wenn man mit reduce(identity,accumulator) beispielsweise Zahlen summieren zu wollen. Für solche Zwecke nutzt man die Stream.collect() Methode
https://docs.oracle.com/javase/tutorial/collections/streams/reduction.html#reduce
Stream.collect
Collection | Stream.collect
Collection Reduction | Stream.collect
Die collect-Methode modifiziert oder verändert den bestehenden Wert in einer Aggregator-Funktion anstatt diesen wie im Falle von reduce(..) ständig neu zu erschaffen. Die Nutzung von collect kann also die Performance in manchen Szenarios erhöhen.
stream().collect(supplier, accumulator, combiner) erwartet 3 Lambda-Expressions bzw. Methoden-Referenzen.
Collection Parallelism
Collection | Parallele Computing & Parallelism
Parallel Computing als parallele Datenverarbeitung gibt es in JAVA inzwischen in mehreren Varianten. Wir können herkömmlich Threads und Runnables anlegen oder aber auch das JAVA Fork-/Join-Framework von JAVA Concurrency verwenden, welches für viele Problemstellungen standartisierte Ansätze bietet.
Collection Strategies
Collection | Collection Strategies
Wir wollen in diesem Themenblock einen Überblick über typische Problemstellungen und Lösungsstrategien bieten.
Die Anzahl von Collection-Interfaces, Collection-Implementierungsklassen, deren Verwendung im Zusammenhang mit sequentiellen Streams oder auch wiederum nebenläufigen parallelen Streams mit nicht zuletzt wiederum einer Vielzahl von funktionalen Interfaces ist für Einsteiger in die Java Collections- und Java Collection Stream API kaum zu überschauen. Lösungsansätze sind mannigfaltig, und jeder Lösungsansatz bietet seine Vorteile und seine Nachteile.
Custom Collections
Collection | Custom-Collections
Die meisten Entwickler werden niemals eine eigene Collection-Klasse programmieren. Man kann diesen Themenblock also im Grunde genommen getrost überspringen. Für diejenigen, die es aber doch einmal genauer wissen möchten: Man muss sich zuerst einmal für die Richtung entscheiden, welchen Typ man schaffen möchte.
Persisente Collection? Applikationsbezogen? High-Performance? General-Purpose? Erweiterte Funktionalität? Praktischer? Adapter Implementierungen?
Bitte nutzen Sie die Originalquellen.
https://docs.oracle.com/javase/tutorial/collections/custom-implementations/index.html
Links
FootNotes
UIO3 Es ist einfacher als Du denkst.
Stelle noch heute Deine Anfrage.

