uio--WebPageMain-Module
JAVA-C2 Collection Advanced Collection Advanced Problemstellung Diagramm

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.

Abbildung: Java Tiers C

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.

Thread-sichere Queues

JAVA-C2 | Thread-sichere Queues

Queues aus java.util.* sind NICHT Thread-sicher. Das java.util.concurrent-Package bietet aber diverse BlockingQueues-Varianten.

Mehr Informationen siehe BlockingQueue.

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 Streams FAQ

Collection | Collection Streams FAQ

FAQ zu Aggregate Operations als Terminal-Operations in der Verarbeitung von Streams.

Eine Liste von Fragen zum Thema.

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


    UI ORGANIZED.

    UIO3 Es ist einfacher als Du denkst.

    Stelle noch heute Deine Anfrage.

    uio--WebPageFooter-Module