semantic-typescript 0.0.8 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/semantic.d.ts +22 -5
- package/dist/semantic.js +106 -52
- package/package.json +53 -8
- package/readme.cn.md +343 -446
- package/readme.de.md +341 -443
- package/readme.es.md +342 -443
- package/readme.fr.md +345 -446
- package/readme.jp.md +346 -448
- package/readme.kr.md +350 -452
- package/readme.md +345 -448
- package/readme.ru.md +347 -448
- package/readme.tw.md +340 -443
package/readme.de.md
CHANGED
|
@@ -1,529 +1,427 @@
|
|
|
1
|
-
# Semantic-TypeScript Stream
|
|
1
|
+
# Semantic-TypeScript Stream-Verarbeitungsbibliothek
|
|
2
2
|
|
|
3
3
|
## Einführung
|
|
4
4
|
|
|
5
|
-
Semantic-TypeScript ist eine moderne Stream-
|
|
5
|
+
Semantic-TypeScript ist eine moderne Stream-Verarbeitungsbibliothek, die von JavaScript GeneratorFunction, Java Stream und MySQL Index inspiriert wurde. Der Kernentwurf der Bibliothek basiert auf der Erstellung effizienter Datenverarbeitungspipelines mittels Datenindizes, um TypeScript-Entwicklern eine typsichere, funktionale Stream-Verarbeitungserfahrung zu bieten.
|
|
6
6
|
|
|
7
|
-
Im Gegensatz zur traditionellen synchronen Verarbeitung verwendet Semantic
|
|
7
|
+
Im Gegensatz zur traditionellen synchronen Verarbeitung verwendet Semantic einen asynchronen Verarbeitungsmodus. Beim Erstellen von Datenströmen hängt der Zeitpunkt des Datenempfangs vollständig davon ab, wann die Upstream-Quelle die `accept`- und `interrupt`-Callback-Funktionen aufruft. Dieser Entwurf ermöglicht der Bibliothek die elegante Verarbeitung von Echtzeit-Datenströmen, großen Datensätzen und asynchronen Datenquellen.
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## Installation
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
| **Funktionale Programmierung** | Unveränderliche Datenstrukturen und reine Funktionen | Vorhersehbarerer Code, einfachere Tests und Wartung |
|
|
15
|
-
| **Lazy Evaluation** | Bedarfsgerechte Berechnung, Leistungsoptimierung | Hohe Speichereffizienz bei der Verarbeitung großer Datensätze |
|
|
16
|
-
| **Asynchrone Stream-Verarbeitung** | Generator-basierte asynchrone Datenströme | Geeignet für Echtzeitdaten und ereignisgesteuerte Szenarien |
|
|
17
|
-
| **Multi-Paradigma-Sammler** | Geordnete, ungeordnete, statistische Sammlungsstrategien | Optimale Strategiewahl basierend auf verschiedenen Szenarien |
|
|
18
|
-
| **Statistische Analyse** | Eingebaute vollständige statistische Berechnungsfunktionen | Integrierte Datenanalyse und Berichterstellungsgenerierung |
|
|
19
|
-
|
|
20
|
-
## Leistungsüberlegungen
|
|
21
|
-
|
|
22
|
-
**Wichtiger Hinweis**: Die folgenden Methoden opfern Leistung, um Daten zu sammeln und zu sortieren, was zu geordneten Datensammlungen führt:
|
|
23
|
-
- `toOrdered()`
|
|
24
|
-
- `toWindow()`
|
|
25
|
-
- `toNumericStatistics()`
|
|
26
|
-
- `toBigIntStatistics()`
|
|
27
|
-
- `sorted()`
|
|
28
|
-
- `sorted(comparator)`
|
|
29
|
-
|
|
30
|
-
Besonders wichtig zu beachten: `sorted()` und `sorted(comparator)` überschreiben die Ergebnisse der folgenden Methoden:
|
|
31
|
-
- `redirect(redirector)`
|
|
32
|
-
- `translate(translator)`
|
|
33
|
-
- `shuffle(mapper)`
|
|
34
|
-
|
|
35
|
-
## Factory-Methoden
|
|
36
|
-
|
|
37
|
-
### Stream-Erstellungs-Factories
|
|
11
|
+
```bash
|
|
12
|
+
npm install semantic-typescript
|
|
13
|
+
```
|
|
38
14
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
|
42
|
-
|
|
43
|
-
| `
|
|
44
|
-
| `
|
|
45
|
-
| `
|
|
46
|
-
| `
|
|
47
|
-
| `
|
|
15
|
+
## Grundlegende Typen
|
|
16
|
+
|
|
17
|
+
| Typ | Beschreibung |
|
|
18
|
+
|-----|-------------|
|
|
19
|
+
| `Invalid<T>` | Typ, der null oder undefined erweitert |
|
|
20
|
+
| `Valid<T>` | Typ, der null und undefined ausschließt |
|
|
21
|
+
| `MaybeInvalid<T>` | Typ, der null oder undefined sein kann |
|
|
22
|
+
| `Primitive` | Sammlung primitiver Typen |
|
|
23
|
+
| `MaybePrimitive<T>` | Typ, der ein Primitiv sein kann |
|
|
24
|
+
| `OptionalSymbol` | Symbolkennung für die Optional-Klasse |
|
|
25
|
+
| `SemanticSymbol` | Symbolkennung für die Semantic-Klasse |
|
|
26
|
+
| `CollectorsSymbol` | Symbolkennung für die Collector-Klasse |
|
|
27
|
+
| `CollectableSymbol` | Symbolkennung für die Collectable-Klasse |
|
|
28
|
+
| `OrderedCollectableSymbol` | Symbolkennung für die OrderedCollectable-Klasse |
|
|
29
|
+
| `WindowCollectableSymbol` | Symbolkennung für die WindowCollectable-Klasse |
|
|
30
|
+
| `StatisticsSymbol` | Symbolkennung für die Statistics-Klasse |
|
|
31
|
+
| `NumericStatisticsSymbol` | Symbolkennung für die NumericStatistics-Klasse |
|
|
32
|
+
| `BigIntStatisticsSymbol` | Symbolkennung für die BigIntStatistics-Klasse |
|
|
33
|
+
| `UnorderedCollectableSymbol` | Symbolkennung für die UnorderedCollectable-Klasse |
|
|
34
|
+
| `Runnable` | Funktion ohne Parameter und Rückgabewert |
|
|
35
|
+
| `Supplier<R>` | Funktion ohne Parameter, die R zurückgibt |
|
|
36
|
+
| `Functional<T, R>` | Ein-Parameter-Transformationsfunktion |
|
|
37
|
+
| `Predicate<T>` | Ein-Parameter-Prüffunktion |
|
|
38
|
+
| `BiFunctional<T, U, R>` | Zwei-Parameter-Transformationsfunktion |
|
|
39
|
+
| `BiPredicate<T, U>` | Zwei-Parameter-Prüffunktion |
|
|
40
|
+
| `Comparator<T>` | Vergleichsfunktion |
|
|
41
|
+
| `TriFunctional<T, U, V, R>` | Drei-Parameter-Transformationsfunktion |
|
|
42
|
+
| `Consumer<T>` | Ein-Parameter-Consumer-Funktion |
|
|
43
|
+
| `BiConsumer<T, U>` | Zwei-Parameter-Consumer-Funktion |
|
|
44
|
+
| `TriConsumer<T, U, V>` | Drei-Parameter-Consumer-Funktion |
|
|
45
|
+
| `Generator<T>` | Generatorfunktion |
|
|
48
46
|
|
|
49
|
-
**Code-Beispiel-Ergänzung:**
|
|
50
47
|
```typescript
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
// Erstelle numerischen Bereichs-Stream
|
|
57
|
-
const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
58
|
-
|
|
59
|
-
// Fülle mit wiederholten Elementen
|
|
60
|
-
const filledStream = fill("hallo", 3n); // "hallo", "hallo", "hallo"
|
|
61
|
-
|
|
62
|
-
// Erstelle leeren Stream
|
|
63
|
-
const emptyStream = empty<number>();
|
|
48
|
+
// Typverwendungsbeispiele
|
|
49
|
+
const predicate: Predicate<number> = (n) => n > 0;
|
|
50
|
+
const mapper: Functional<string, number> = (str) => str.length;
|
|
51
|
+
const comparator: Comparator<number> = (a, b) => a - b;
|
|
64
52
|
```
|
|
65
53
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
|
69
|
-
|
|
70
|
-
| `validate
|
|
71
|
-
| `invalidate
|
|
72
|
-
| `
|
|
73
|
-
| `
|
|
54
|
+
## Typwächter (Type Guards)
|
|
55
|
+
|
|
56
|
+
| Funktion | Beschreibung | Zeitkomplexität | Raumkomplexität |
|
|
57
|
+
|----------|-------------|-----------------|-----------------|
|
|
58
|
+
| `validate<T>(t: MaybeInvalid<T>): t is T` | Prüft, ob Wert nicht null oder undefined | O(1) | O(1) |
|
|
59
|
+
| `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | Prüft, ob Wert null oder undefined | O(1) | O(1) |
|
|
60
|
+
| `isBoolean(t: unknown): t is boolean` | Prüft auf Boolean | O(1) | O(1) |
|
|
61
|
+
| `isString(t: unknown): t is string` | Prüft auf String | O(1) | O(1) |
|
|
62
|
+
| `isNumber(t: unknown): t is number` | Prüft auf Number | O(1) | O(1) |
|
|
63
|
+
| `isFunction(t: unknown): t is Function` | Prüft auf Function | O(1) | O(1) |
|
|
64
|
+
| `isObject(t: unknown): t is object` | Prüft auf Object | O(1) | O(1) |
|
|
65
|
+
| `isSymbol(t: unknown): t is symbol` | Prüft auf Symbol | O(1) | O(1) |
|
|
66
|
+
| `isBigint(t: unknown): t is bigint` | Prüft auf BigInt | O(1) | O(1) |
|
|
67
|
+
| `isPrimitive(t: unknown): t is Primitive` | Prüft auf Primitivtyp | O(1) | O(1) |
|
|
68
|
+
| `isIterable(t: unknown): t is Iterable<unknown>` | Prüft auf Iterierbarkeit | O(1) | O(1) |
|
|
69
|
+
| `isOptional(t: unknown): t is Optional<unknown>` | Prüft auf Optional-Instanz | O(1) | O(1) |
|
|
70
|
+
| `isSemantic(t: unknown): t is Semantic<unknown>` | Prüft auf Semantic-Instanz | O(1) | O(1) |
|
|
71
|
+
| `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | Prüft auf Collector-Instanz | O(1) | O(1) |
|
|
72
|
+
| `isCollectable(t: unknown): t is Collectable<unknown>` | Prüft auf Collectable-Instanz | O(1) | O(1) |
|
|
73
|
+
| `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | Prüft auf OrderedCollectable-Instanz | O(1) | O(1) |
|
|
74
|
+
| `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | Prüft auf WindowCollectable-Instanz | O(1) | O(1) |
|
|
75
|
+
| `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | Prüft auf UnorderedCollectable-Instanz | O(1) | O(1) |
|
|
76
|
+
| `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | Prüft auf Statistics-Instanz | O(1) | O(1) |
|
|
77
|
+
| `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | Prüft auf NumericStatistics-Instanz | O(1) | O(1) |
|
|
78
|
+
| `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | Prüft auf BigIntStatistics-Instanz | O(1) | O(1) |
|
|
74
79
|
|
|
75
|
-
**Code-Beispiel-Ergänzung:**
|
|
76
80
|
```typescript
|
|
77
|
-
|
|
81
|
+
// Typwächter-Verwendungsbeispiele
|
|
82
|
+
const value: unknown = "hello";
|
|
78
83
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
if (validate(data)) {
|
|
82
|
-
console.log(data.toUpperCase()); // Sichere Aufruf, da validate sicherstellt, dass Daten nicht null sind
|
|
84
|
+
if (isString(value)) {
|
|
85
|
+
console.log(value.length); // Typsicher, value wird als string inferiert
|
|
83
86
|
}
|
|
84
87
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
console.log("Daten ungültig"); // Wird ausgeführt, da invalidate null erkannt hat
|
|
88
|
+
if (isOptional(someValue)) {
|
|
89
|
+
someValue.ifPresent(val => console.log(val));
|
|
88
90
|
}
|
|
89
|
-
|
|
90
|
-
// Vergleiche Werte
|
|
91
|
-
const comparison = useCompare("Apfel", "Banane"); // -1
|
|
92
|
-
|
|
93
|
-
// Generiere Zufallszahl
|
|
94
|
-
const randomNum = useRandom(42); // Zufallszahl basierend auf Seed 42
|
|
95
91
|
```
|
|
96
92
|
|
|
97
|
-
##
|
|
98
|
-
|
|
99
|
-
### Optional<T> - Sichere Nullwert-Behandlung
|
|
100
|
-
|
|
101
|
-
Die Optional-Klasse bietet einen funktionalen Ansatz zur sicheren Handhabung von Werten, die null oder undefined sein könnten.
|
|
93
|
+
## Hilfsfunktionen
|
|
102
94
|
|
|
103
|
-
|
|
|
104
|
-
|
|
105
|
-
| `
|
|
106
|
-
| `
|
|
107
|
-
| `getOrDefault(defaultValue: T)` | `T` | Hole Wert oder Standardwert | O(1) |
|
|
108
|
-
| `ifPresent(action: Consumer<T>)` | `void` | Führe Aktion aus wenn Wert existiert | O(1) |
|
|
109
|
-
| `isEmpty()` | `boolean` | Prüfe ob leer | O(1) |
|
|
110
|
-
| `isPresent()` | `boolean` | Prüfe ob Wert existiert | O(1) |
|
|
111
|
-
| `map<R>(mapper: Functional<T, R>)` | `Optional<R>` | Mappe und transformiere Wert | O(1) |
|
|
112
|
-
| `static of<T>(value: MaybeInvalid<T>)` | `Optional<T>` | Erstelle Optional-Instanz | O(1) |
|
|
113
|
-
| `static ofNullable<T>(value?)` | `Optional<T>` | Erstelle nullable Optional | O(1) |
|
|
114
|
-
| `static ofNonNull<T>(value: T)` | `Optional<T>` | Erstelle Non-Null Optional | O(1) |
|
|
95
|
+
| Funktion | Beschreibung | Zeitkomplexität | Raumkomplexität |
|
|
96
|
+
|----------|-------------|-----------------|-----------------|
|
|
97
|
+
| `useCompare<T>(t1: T, t2: T): number` | Allgemeine Vergleichsfunktion | O(1) | O(1) |
|
|
98
|
+
| `useRandom<T = number \| bigint>(index: T): T` | Pseudozufallszahlengenerator | O(log n) | O(1) |
|
|
115
99
|
|
|
116
|
-
**Code-Beispiel-Ergänzung:**
|
|
117
100
|
```typescript
|
|
118
|
-
|
|
101
|
+
// Hilfsfunktions-Verwendungsbeispiele
|
|
102
|
+
const numbers = [3, 1, 4, 1, 5];
|
|
103
|
+
numbers.sort(useCompare); // [1, 1, 3, 4, 5]
|
|
119
104
|
|
|
120
|
-
//
|
|
121
|
-
const
|
|
105
|
+
const randomNum = useRandom(42); // Seed-basierte Zufallszahl
|
|
106
|
+
const randomBigInt = useRandom(1000n); // BigInt-Zufallszahl
|
|
107
|
+
```
|
|
122
108
|
|
|
123
|
-
|
|
124
|
-
const result = optionalValue
|
|
125
|
-
.filter(val => val.length > 3) // Filtere Werte länger als 3
|
|
126
|
-
.map(val => val.toUpperCase()) // Konvertiere zu Großbuchstaben
|
|
127
|
-
.getOrDefault("standard"); // Hole Wert oder Standard
|
|
109
|
+
## Fabrikmethoden
|
|
128
110
|
|
|
129
|
-
|
|
111
|
+
### Optional-Fabrikmethoden
|
|
130
112
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
113
|
+
| Methode | Beschreibung | Zeitkomplexität | Raumkomplexität |
|
|
114
|
+
|---------|-------------|-----------------|-----------------|
|
|
115
|
+
| `Optional.empty<T>()` | Erstellt leeres Optional | O(1) | O(1) |
|
|
116
|
+
| `Optional.of<T>(value)` | Erstellt Optional mit Wert | O(1) | O(1) |
|
|
117
|
+
| `Optional.ofNullable<T>(value)` | Erstellt Optional, das null sein kann | O(1) | O(1) |
|
|
118
|
+
| `Optional.ofNonNull<T>(value)` | Erstellt nicht-null Optional | O(1) | O(1) |
|
|
135
119
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
120
|
+
```typescript
|
|
121
|
+
// Optional-Verwendungsbeispiele
|
|
122
|
+
const emptyOpt = Optional.empty<number>();
|
|
123
|
+
const presentOpt = Optional.of(42);
|
|
124
|
+
const nullableOpt = Optional.ofNullable<string>(null);
|
|
125
|
+
const nonNullOpt = Optional.ofNonNull("hello");
|
|
126
|
+
|
|
127
|
+
presentOpt.ifPresent(val => console.log(val)); // Gibt 42 aus
|
|
128
|
+
console.log(emptyOpt.orElse(100)); // Gibt 100 aus
|
|
142
129
|
```
|
|
143
130
|
|
|
144
|
-
###
|
|
145
|
-
|
|
146
|
-
Semantic ist die Kern-Stream-Verarbeitungsklasse und bietet reichhaltige Stream-Operatoren.
|
|
147
|
-
|
|
148
|
-
#### Stream-Transformations-Operationen
|
|
149
|
-
|
|
150
|
-
| Methode | Rückgabetyp | Beschreibung | Leistungsauswirkung |
|
|
151
|
-
|------|----------|------|----------|
|
|
152
|
-
| `concat(other: Semantic<E>)` | `Semantic<E>` | Verkette zwei Streams | O(n+m) |
|
|
153
|
-
| `distinct()` | `Semantic<E>` | Entferne Duplikate (mit Set) | O(n) |
|
|
154
|
-
| `distinct(comparator)` | `Semantic<E>` | Benutzerdefinierte Comparator-Deduplizierung | O(n²) |
|
|
155
|
-
| `dropWhile(predicate)` | `Semantic<E>` | Verwerfe Startelemente, die Bedingung erfüllen | O(n) |
|
|
156
|
-
| `filter(predicate)` | `Semantic<E>` | Filtere Elemente | O(n) |
|
|
157
|
-
| `flat(mapper)` | `Semantic<E>` | Glätte verschachtelte Streams | O(n×m) |
|
|
158
|
-
| `flatMap(mapper)` | `Semantic<R>` | Mappe und glätte | O(n×m) |
|
|
159
|
-
| `limit(n)` | `Semantic<E>` | Begrenze Anzahl der Elemente | O(n) |
|
|
160
|
-
| `map(mapper)` | `Semantic<R>` | Mappe und transformiere Elemente | O(n) |
|
|
161
|
-
| `peek(consumer)` | `Semantic<E>` | Betrachte Elemente ohne Modifikation | O(n) |
|
|
162
|
-
| `redirect(redirector)` | `Semantic<E>` | Leite Indizes um | O(n) |
|
|
163
|
-
| `reverse()` | `Semantic<E>` | Kehre Stream-Reihenfolge um | O(n) |
|
|
164
|
-
| `shuffle()` | `Semantic<E>` | Mische Reihenfolge zufällig | O(n) |
|
|
165
|
-
| `shuffle(mapper)` | `Semantic<E>` | Benutzerdefinierte Shuffle-Logik | O(n) |
|
|
166
|
-
| `skip(n)` | `Semantic<E>` | Überspringe erste n Elemente | O(n) |
|
|
167
|
-
| `sub(start, end)` | `Semantic<E>` | Hole Substream | O(n) |
|
|
168
|
-
| `takeWhile(predicate)` | `Semantic<E>` | Hole Startelemente, die Bedingung erfüllen | O(n) |
|
|
169
|
-
| `translate(offset)` | `Semantic<E>` | Übersetze Indizes | O(n) |
|
|
170
|
-
| `translate(translator)` | `Semantic<E>` | Benutzerdefinierte Index-Transformation | O(n) |
|
|
171
|
-
|
|
172
|
-
**Code-Beispiel-Ergänzung:**
|
|
173
|
-
```typescript
|
|
174
|
-
import { from } from 'semantic-typescript';
|
|
131
|
+
### Collector-Fabrikmethoden
|
|
175
132
|
|
|
176
|
-
|
|
133
|
+
| Methode | Beschreibung | Zeitkomplexität | Raumkomplexität |
|
|
134
|
+
|---------|-------------|-----------------|-----------------|
|
|
135
|
+
| `Collector.full(identity, accumulator, finisher)` | Erstellt vollständigen Collector | O(1) | O(1) |
|
|
136
|
+
| `Collector.shortable(identity, interruptor, accumulator, finisher)` | Erstellt unterbrechbaren Collector | O(1) | O(1) |
|
|
177
137
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
138
|
+
```typescript
|
|
139
|
+
// Collector-Verwendungsbeispiele
|
|
140
|
+
const sumCollector = Collector.full(
|
|
141
|
+
() => 0,
|
|
142
|
+
(sum, num) => sum + num,
|
|
143
|
+
result => result
|
|
144
|
+
);
|
|
185
145
|
|
|
186
|
-
|
|
146
|
+
const numbers = from([1, 2, 3, 4, 5]);
|
|
147
|
+
const total = numbers.toUnoredered().collect(sumCollector); // 15
|
|
187
148
|
```
|
|
188
149
|
|
|
189
|
-
|
|
150
|
+
### Semantic-Fabrikmethoden
|
|
190
151
|
|
|
191
|
-
| Methode |
|
|
192
|
-
|
|
193
|
-
| `
|
|
194
|
-
| `
|
|
195
|
-
| `
|
|
196
|
-
| `
|
|
197
|
-
| `
|
|
198
|
-
| `
|
|
199
|
-
| `
|
|
152
|
+
| Methode | Beschreibung | Zeitkomplexität | Raumkomplexität |
|
|
153
|
+
|---------|--------------|-----------------|-----------------|
|
|
154
|
+
| `blob(blob, chunkSize)` | Erzeugt Stream aus Blob | O(n) | O(chunkSize) |
|
|
155
|
+
| `empty<E>()` | Erzeugt leeren Stream | O(1) | O(1) |
|
|
156
|
+
| `fill<E>(element, count)` | Erzeugt gefüllten Stream | O(n) | O(1) |
|
|
157
|
+
| `from<E>(iterable)` | Erzeugt Stream aus iterierbarem Objekt | O(1) | O(1) |
|
|
158
|
+
| `interval(period, delay?)` | Erzeugt regelmäßigen Intervall-Stream | O(1)* | O(1) |
|
|
159
|
+
| `iterate<E>(generator)` | Erzeugt Stream aus Generator | O(1) | O(1) |
|
|
160
|
+
| `range(start, end, step)` | Erzeugt numerischen Bereichs-Stream | O(n) | O(1) |
|
|
161
|
+
| `websocket(websocket)` | Erzeugt Stream aus WebSocket | O(1) | O(1) |
|
|
200
162
|
|
|
201
|
-
**Code-Beispiel-Ergänzung:**
|
|
202
163
|
```typescript
|
|
203
|
-
|
|
164
|
+
// Beispiel zur Verwendung der Semantic-Fabrikmethoden
|
|
204
165
|
|
|
205
|
-
|
|
166
|
+
// Stream aus Blob erzeugen (chunkweises Lesen)
|
|
167
|
+
blob(someBlob, 1024n)
|
|
168
|
+
.toUnordered()
|
|
169
|
+
.write(WritableStream)
|
|
170
|
+
.then(callback) // Stream-Schreibvorgang erfolgreich
|
|
171
|
+
.catch(writeFi); // Stream-Schreibvorgang fehlgeschlagen
|
|
206
172
|
|
|
207
|
-
//
|
|
208
|
-
|
|
173
|
+
// Leeren Stream erzeugen, der erst nach Verknüpfung mit anderen Streams ausgeführt wird
|
|
174
|
+
empty<string>()
|
|
175
|
+
.toUnordered()
|
|
176
|
+
.join(); //[]
|
|
209
177
|
|
|
210
|
-
//
|
|
211
|
-
const
|
|
178
|
+
// Gefüllten Stream erzeugen
|
|
179
|
+
const filledStream = fill("hello", 3); // "hello", "hello", "hello"
|
|
212
180
|
|
|
213
|
-
//
|
|
214
|
-
|
|
181
|
+
// Zeitgesteuerten Stream mit 2 Sekunden anfänglicher Verzögerung und 5 Sekunden Zyklus erzeugen,
|
|
182
|
+
// implementiert über Timer-Mechanismus, mögliche Zeitabweichungen aufgrund von System-Schedulereinschränkungen.
|
|
183
|
+
const intervalStream = interval(5000, 2000);
|
|
215
184
|
|
|
216
|
-
//
|
|
217
|
-
const
|
|
185
|
+
// Stream aus iterierbarem Objekt erzeugen
|
|
186
|
+
const numberStream = from([1, 2, 3, 4, 5]);
|
|
187
|
+
const stringStream = from(new Set(["Alex", "Bob"]));
|
|
218
188
|
|
|
219
|
-
//
|
|
220
|
-
const
|
|
189
|
+
// Bereichs-Stream erzeugen
|
|
190
|
+
const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
221
191
|
|
|
222
|
-
//
|
|
192
|
+
// WebSocket-Ereignisstream
|
|
193
|
+
const ws = new WebSocket("ws://localhost:8080");
|
|
194
|
+
websocket(ws)
|
|
195
|
+
.filter((event)=> event.type === "message") // Nur Nachrichtenereignisse überwachen
|
|
196
|
+
.toUnordered() // Für Ereignisse normalerweise ungeordnet
|
|
197
|
+
.forEach((event)=> receive(event)); // Nachrichten empfangen
|
|
223
198
|
```
|
|
224
199
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
200
|
+
## Semantic-Klassenmethoden
|
|
201
|
+
|
|
202
|
+
| Methode | Beschreibung | Zeitkomplexität | Raumkomplexität |
|
|
203
|
+
|---------|-------------|-----------------|-----------------|
|
|
204
|
+
| `concat(other)` | Verbindet zwei Streams | O(n) | O(1) |
|
|
205
|
+
| `distinct()` | Entfernt Duplikate | O(n) | O(n) |
|
|
206
|
+
| `distinct(comparator)` | Entfernt Duplikate mit Comparator | O(n²) | O(n) |
|
|
207
|
+
| `dropWhile(predicate)` | Verwirft Elemente, die Prädikat erfüllen | O(n) | O(1) |
|
|
208
|
+
| `filter(predicate)` | Filtert Elemente | O(n) | O(1) |
|
|
209
|
+
| `flat(mapper)` | Flache Abbildung | O(n × m) | O(1) |
|
|
210
|
+
| `flatMap(mapper)` | Flache Abbildung auf neuen Typ | O(n × m) | O(1) |
|
|
211
|
+
| `limit(n)` | Begrenzt Elementanzahl | O(n) | O(1) |
|
|
212
|
+
| `map(mapper)` | Transformationsabbildung | O(n) | O(1) |
|
|
213
|
+
| `peek(consumer)` | Zeigt Elemente an | O(n) | O(1) |
|
|
214
|
+
| `redirect(redirector)` | Index-Umleitung | O(n) | O(1) |
|
|
215
|
+
| `reverse()` | Kehrt Stream um | O(n) | O(1) |
|
|
216
|
+
| `shuffle()` | Zufällige Neuanordnung | O(n) | O(1) |
|
|
217
|
+
| `shuffle(mapper)` | Neuanordnung mit Mapper | O(n) | O(1) |
|
|
218
|
+
| `skip(n)` | Überspringt erste n Elemente | O(n) | O(1) |
|
|
219
|
+
| `sorted()` | Sortiert | O(n log n) | O(n) |
|
|
220
|
+
| `sorted(comparator)` | Sortiert mit Comparator | O(n log n) | O(n) |
|
|
221
|
+
| `sub(start, end)` | Erstellt Substream | O(n) | O(1) |
|
|
222
|
+
| `takeWhile(predicate)` | Nimmt Elemente, die Prädikat erfüllen | O(n) | O(1) |
|
|
223
|
+
| `translate(offset)` | Index-Translation | O(n) | O(1) |
|
|
224
|
+
| `translate(translator)` | Index-Translation mit Translator | O(n) | O(1) |
|
|
228
225
|
|
|
229
|
-
| Methode | Beschreibung | Verwendungsszenario |
|
|
230
|
-
|------|------|----------|
|
|
231
|
-
| `collect(generator)` | Führe Datensammlung aus | Stream-Terminaloperation |
|
|
232
|
-
| `static full(identity, accumulator, finisher)` | Erstelle vollständigen Collector | Erfordert vollständige Verarbeitung |
|
|
233
|
-
| `static shortable(identity, interruptor, accumulator, finisher)` | Erstelle unterbrechbaren Collector | Kann vorzeitig beendet werden |
|
|
234
|
-
|
|
235
|
-
**Code-Beispiel-Ergänzung:**
|
|
236
226
|
```typescript
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
//
|
|
240
|
-
|
|
241
|
-
()
|
|
242
|
-
(
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
//
|
|
247
|
-
const
|
|
248
|
-
|
|
227
|
+
// Semantic-Operationsbeispiele
|
|
228
|
+
const result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
229
|
+
.filter(n => n % 2 === 0) // Filtert gerade Zahlen
|
|
230
|
+
.map(n => n * 2) // Multipliziert mit 2
|
|
231
|
+
.skip(1) // Überspringt erstes Element
|
|
232
|
+
.limit(3) // Begrenzt auf 3 Elemente
|
|
233
|
+
.toArray(); // Konvertiert zu Array
|
|
234
|
+
// Ergebnis: [8, 12, 20]
|
|
235
|
+
|
|
236
|
+
// Komplexe Operationsbeispiele
|
|
237
|
+
const complexResult = range(1, 100, 1)
|
|
238
|
+
.flatMap(n => from([n, n * 2])) // Abbildet jedes Element zu zwei Elementen
|
|
239
|
+
.distinct() // Entfernt Duplikate
|
|
240
|
+
.shuffle() // Mischt zufällig
|
|
241
|
+
.takeWhile(n => n < 50) // Nimmt Elemente < 50
|
|
242
|
+
.toOrdered() // Konvertiert zu geordnetem Collector
|
|
243
|
+
.toArray(); // Konvertiert zu Array
|
|
249
244
|
```
|
|
250
245
|
|
|
251
|
-
|
|
246
|
+
## Collector-Transformationsmethoden
|
|
252
247
|
|
|
253
|
-
|
|
248
|
+
| Methode | Beschreibung | Zeitkomplexität | Raumkomplexität |
|
|
249
|
+
|---------|-------------|-----------------|-----------------|
|
|
250
|
+
| `toUnoredered()` | Konvertiert zu ungeordnetem Collector (Leistungspriorität) | O(1) | O(1) |
|
|
251
|
+
| `toOrdered()` | Konvertiert zu geordnetem Collector | O(1) | O(1) |
|
|
252
|
+
| `sorted()` | Sortiert und konvertiert zu geordnetem Collector | O(n log n) | O(n) |
|
|
253
|
+
| `toWindow()` | Konvertiert zu Fenster-Collector | O(1) | O(1) |
|
|
254
|
+
| `toNumericStatistics()` | Konvertiert zu numerischer Statistik | O(1) | O(1) |
|
|
255
|
+
| `toBigintStatistics()` | Konvertiert zu BigInt-Statistik | O(1) | O(1) |
|
|
254
256
|
|
|
255
|
-
|
|
257
|
+
```typescript
|
|
258
|
+
// Collector-Transformationsbeispiele
|
|
259
|
+
const numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
|
|
256
260
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
| `count()` | `bigint` | Elementanzahl-Statistiken | `count()` → `5n` |
|
|
262
|
-
| `isEmpty()` | `boolean` | Ob Stream leer ist | `isEmpty()` |
|
|
263
|
-
| `findAny()` | `Optional<E>` | Finde irgendein Element | `findAny()` |
|
|
264
|
-
| `findFirst()` | `Optional<E>` | Finde erstes Element | `findFirst()` |
|
|
265
|
-
| `findLast()` | `Optional<E>` | Finde letztes Element | `findLast()` |
|
|
261
|
+
// Leistungspriorität: Ungeordneten Collector verwenden
|
|
262
|
+
const unordered = numbers
|
|
263
|
+
.filter(n => n > 3)
|
|
264
|
+
.toUnoredered();
|
|
266
265
|
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
import { from } from 'semantic-typescript';
|
|
266
|
+
// Sortierung benötigt: Geordneten Collector verwenden
|
|
267
|
+
const ordered = numbers.sorted();
|
|
270
268
|
|
|
271
|
-
|
|
269
|
+
// Statistische Analyse: Statistik-Collector verwenden
|
|
270
|
+
const stats = numbers
|
|
271
|
+
.toNumericStatistics();
|
|
272
|
+
|
|
273
|
+
console.log(stats.mean()); // Durchschnitt
|
|
274
|
+
console.log(stats.median()); // Median
|
|
275
|
+
console.log(stats.standardDeviation()); // Standardabweichung
|
|
272
276
|
|
|
273
|
-
//
|
|
274
|
-
const
|
|
277
|
+
// Fensteroperationen
|
|
278
|
+
const windowed = numbers
|
|
279
|
+
.toWindow()
|
|
280
|
+
.tumble(3n); // Fenster mit je 3 Elementen
|
|
275
281
|
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
const count = collectable.count(); // 5n
|
|
280
|
-
const isEmpty = collectable.isEmpty(); // false
|
|
281
|
-
const firstElement = collectable.findFirst(); // Optional.of(1)
|
|
282
|
-
const anyElement = collectable.findAny(); // Irgendein Element
|
|
282
|
+
windowed.forEach(window => {
|
|
283
|
+
console.log(window.toArray()); // Inhalt jedes Fensters
|
|
284
|
+
});
|
|
283
285
|
```
|
|
284
286
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
| Methode |
|
|
288
|
-
|
|
289
|
-
| `
|
|
290
|
-
| `
|
|
291
|
-
| `
|
|
292
|
-
| `
|
|
293
|
-
| `
|
|
294
|
-
| `
|
|
295
|
-
| `
|
|
296
|
-
| `
|
|
297
|
-
| `
|
|
298
|
-
| `
|
|
299
|
-
| `
|
|
300
|
-
|
|
301
|
-
|
|
287
|
+
## Collectable-Sammelmethoden
|
|
288
|
+
|
|
289
|
+
| Methode | Beschreibung | Zeitkomplexität | Raumkomplexität |
|
|
290
|
+
|---------|-------------|-----------------|-----------------|
|
|
291
|
+
| `anyMatch(predicate)` | Prüft auf existierende Übereinstimmung | O(n) | O(1) |
|
|
292
|
+
| `allMatch(predicate)` | Prüft auf vollständige Übereinstimmung | O(n) | O(1) |
|
|
293
|
+
| `count()` | Elementzählung | O(n) | O(1) |
|
|
294
|
+
| `isEmpty()` | Prüft auf Leerheit | O(1) | O(1) |
|
|
295
|
+
| `findAny()` | Findet beliebiges Element | O(n) | O(1) |
|
|
296
|
+
| `findFirst()` | Findet erstes Element | O(n) | O(1) |
|
|
297
|
+
| `findLast()` | Findet letztes Element | O(n) | O(1) |
|
|
298
|
+
| `forEach(action)` | Iteriert über alle Elemente | O(n) | O(1) |
|
|
299
|
+
| `group(classifier)` | Gruppiert nach Klassifikator | O(n) | O(n) |
|
|
300
|
+
| `groupBy(keyExtractor, valueExtractor)` | Gruppiert nach Schlüssel-Wert-Extraktor | O(n) | O(n) |
|
|
301
|
+
| `join()` | Verbindet zu String | O(n) | O(n) |
|
|
302
|
+
| `join(delimiter)` | Verbindet mit Trennzeichen | O(n) | O(n) |
|
|
303
|
+
| `nonMatch(predicate)` | Prüft auf keine Übereinstimmung | O(n) | O(1) |
|
|
304
|
+
| `partition(count)` | Partitioniert nach Anzahl | O(n) | O(n) |
|
|
305
|
+
| `partitionBy(classifier)` | Partitioniert nach Klassifikator | O(n) | O(n) |
|
|
306
|
+
| `reduce(accumulator)` | Reduktionsoperation | O(n) | O(1) |
|
|
307
|
+
| `reduce(identity, accumulator)` | Reduktion mit Initialwert | O(n) | O(1) |
|
|
308
|
+
| `toArray()` | Konvertiert zu Array | O(n) | O(n) |
|
|
309
|
+
| `toMap(keyExtractor, valueExtractor)` | Konvertiert zu Map | O(n) | O(n) |
|
|
310
|
+
| `toSet()` | Konvertiert zu Set | O(n) | O(n) |
|
|
311
|
+
| `write(stream)` | Schreibt in Stream | O(n) | O(1) |
|
|
312
|
+
|
|
302
313
|
```typescript
|
|
303
|
-
|
|
314
|
+
// Collectable-Operationsbeispiele
|
|
315
|
+
const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
316
|
+
.filter(n => n % 2 === 0)
|
|
317
|
+
.toOrdered();
|
|
304
318
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
{ name: "Charlie", age: 25, city: "New York" }
|
|
309
|
-
]);
|
|
319
|
+
// Übereinstimmungsprüfungen
|
|
320
|
+
console.log(data.anyMatch(n => n > 5)); // true
|
|
321
|
+
console.log(data.allMatch(n => n < 20)); // true
|
|
310
322
|
|
|
311
|
-
//
|
|
312
|
-
|
|
323
|
+
// Suchoperationen
|
|
324
|
+
data.findFirst().ifPresent(n => console.log(n)); // 2
|
|
325
|
+
data.findAny().ifPresent(n => console.log(n)); // Beliebiges Element
|
|
313
326
|
|
|
314
327
|
// Gruppierungsoperationen
|
|
315
|
-
const
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
const byAge = collectable.groupBy(
|
|
319
|
-
person => person.age,
|
|
320
|
-
person => person.name
|
|
328
|
+
const grouped = data.groupBy(
|
|
329
|
+
n => n > 5 ? "large" : "small",
|
|
330
|
+
n => n * 2
|
|
321
331
|
);
|
|
322
|
-
//
|
|
323
|
-
|
|
324
|
-
// Konvertiere zu Sammlungen
|
|
325
|
-
const array = collectable.toArray(); // Ursprüngliches Array
|
|
326
|
-
const set = collectable.toSet(); // Set-Sammlung
|
|
327
|
-
const map = collectable.toMap(
|
|
328
|
-
person => person.name,
|
|
329
|
-
person => person.age
|
|
330
|
-
); // Map { "Alice" => 25, "Bob" => 30, "Charlie" => 25 }
|
|
332
|
+
// {small: [4, 8], large: [12, 16, 20]}
|
|
331
333
|
|
|
332
334
|
// Reduktionsoperationen
|
|
333
|
-
const
|
|
334
|
-
const oldest = collectable.reduce((a, b) => a.age > b.age ? a : b); // Optional.of({name: "Bob", age: 30, ...})
|
|
335
|
-
```
|
|
336
|
-
|
|
337
|
-
### Spezifische Collector-Implementierungen
|
|
335
|
+
const sum = data.reduce(0, (acc, n) => acc + n); // 30
|
|
338
336
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
- **Methoden**: Erbt alle Collectable-Methoden
|
|
343
|
-
|
|
344
|
-
#### OrderedCollectable<E>
|
|
345
|
-
- **Charakteristiken**: Garantiert Elementreihenfolge, geringere Leistung
|
|
346
|
-
- **Verwendungsszenarien**: Erfordern sortierte Ergebnisse
|
|
347
|
-
- **Spezielle Methoden**: Erbt alle Methoden, behält internen Sortierzustand bei
|
|
337
|
+
// Ausgabeoperationen
|
|
338
|
+
data.join(", "); // "2, 4, 6, 8, 10"
|
|
339
|
+
```
|
|
348
340
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
341
|
+
## Statistische Analysemethoden
|
|
342
|
+
|
|
343
|
+
### NumericStatistics-Methoden
|
|
344
|
+
|
|
345
|
+
| Methode | Beschreibung | Zeitkomplexität | Raumkomplexität |
|
|
346
|
+
|---------|-------------|-----------------|-----------------|
|
|
347
|
+
| `range()` | Spannweite | O(n) | O(1) |
|
|
348
|
+
| `variance()` | Varianz | O(n) | O(1) |
|
|
349
|
+
| `standardDeviation()` | Standardabweichung | O(n) | O(1) |
|
|
350
|
+
| `mean()` | Mittelwert | O(n) | O(1) |
|
|
351
|
+
| `median()` | Median | O(n log n) | O(n) |
|
|
352
|
+
| `mode()` | Modus | O(n) | O(n) |
|
|
353
|
+
| `frequency()` | Häufigkeitsverteilung | O(n) | O(n) |
|
|
354
|
+
| `summate()` | Summierung | O(n) | O(1) |
|
|
355
|
+
| `quantile(quantile)` | Quantil | O(n log n) | O(n) |
|
|
356
|
+
| `interquartileRange()` | Interquartilsabstand | O(n log n) | O(n) |
|
|
357
|
+
| `skewness()` | Schiefe | O(n) | O(1) |
|
|
358
|
+
| `kurtosis()` | Wölbung | O(n) | O(1) |
|
|
355
359
|
|
|
356
|
-
**Code-Beispiel-Ergänzung:**
|
|
357
360
|
```typescript
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
const
|
|
361
|
+
// Statistische Analysebeispiele
|
|
362
|
+
const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
363
|
+
.toNumericStatistics();
|
|
364
|
+
|
|
365
|
+
console.log("Mittelwert:", numbers.mean()); // 5.5
|
|
366
|
+
console.log("Median:", numbers.median()); // 5.5
|
|
367
|
+
console.log("Standardabweichung:", numbers.standardDeviation()); // ~2.87
|
|
368
|
+
console.log("Summe:", numbers.summate()); // 55
|
|
369
|
+
|
|
370
|
+
// Statistische Analyse mit Mapper
|
|
371
|
+
const objects = from([
|
|
372
|
+
{ value: 10 },
|
|
373
|
+
{ value: 20 },
|
|
374
|
+
{ value: 30 }
|
|
375
|
+
]).toNumericStatistics();
|
|
376
|
+
|
|
377
|
+
console.log("Gemappter Mittelwert:", objects.mean(obj => obj.value)); // 20
|
|
378
|
+
```
|
|
369
379
|
|
|
370
|
-
|
|
371
|
-
const windowed = data.toWindow();
|
|
372
|
-
const slidingWindows = windowed.slide(3n, 2n); // Fenstergröße 3, Schritt 2
|
|
373
|
-
// Fenster 1: [1, 2, 3], Fenster 2: [3, 4, 5], Fenster 3: [5, 6, 7], ...
|
|
380
|
+
## Leistungsauswahlleitfaden
|
|
374
381
|
|
|
375
|
-
|
|
376
|
-
|
|
382
|
+
### Ungeordneten Collector wählen (Leistungspriorität)
|
|
383
|
+
```typescript
|
|
384
|
+
// Wenn keine Reihenfolgegarantie benötigt wird
|
|
385
|
+
const highPerformance = data
|
|
386
|
+
.filter(predicate)
|
|
387
|
+
.map(mapper)
|
|
388
|
+
.toUnoredered(); // Beste Leistung
|
|
377
389
|
```
|
|
378
390
|
|
|
379
|
-
###
|
|
380
|
-
|
|
381
|
-
Statistische Analyse-Basisklasse, die reichhaltige statistische Berechnungsmethoden bietet. **Hinweis: Muss zuerst Statistics-Instanz erhalten, indem toNumericStatistics() oder toBigIntStatistics() durch Semantic-Instanz aufgerufen werden, bevor die folgenden Methoden verwendet werden können.**
|
|
382
|
-
|
|
383
|
-
#### Statistische Berechnungs-Operationen
|
|
384
|
-
|
|
385
|
-
| Methode | Rückgabetyp | Beschreibung | Algorithmus-Komplexität |
|
|
386
|
-
|------|----------|------|------------|
|
|
387
|
-
| `maximum()` | `Optional<E>` | Maximalwert | O(n) |
|
|
388
|
-
| `minimum()` | `Optional<E>` | Minimalwert | O(n) |
|
|
389
|
-
| `range()` | `D` | Bereich (max-min) | O(n) |
|
|
390
|
-
| `variance()` | `D` | Varianz | O(n) |
|
|
391
|
-
| `standardDeviation()` | `D` | Standardabweichung | O(n) |
|
|
392
|
-
| `mean()` | `D` | Mittelwert | O(n) |
|
|
393
|
-
| `median()` | `D` | Medianwert | O(n log n) |
|
|
394
|
-
| `mode()` | `D` | Modalwert | O(n) |
|
|
395
|
-
| `frequency()` | `Map<D, bigint>` | Häufigkeitsverteilung | O(n) |
|
|
396
|
-
| `summate()` | `D` | Summierung | O(n) |
|
|
397
|
-
| `quantile(quantile)` | `D` | Quantil | O(n log n) |
|
|
398
|
-
| `interquartileRange()` | `D` | Interquartilsabstand | O(n log n) |
|
|
399
|
-
| `skewness()` | `D` | Schiefe | O(n) |
|
|
400
|
-
| `kurtosis()` | `D` | Kurtosis | O(n) |
|
|
401
|
-
|
|
402
|
-
**Code-Beispiel-Ergänzung:**
|
|
391
|
+
### Geordneten Collector wählen (Reihenfolge benötigt)
|
|
403
392
|
```typescript
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
// Muss zu statistischem Objekt konvertiert werden, bevor statistische Methoden verwendet werden
|
|
409
|
-
const stats = numbers.toNumericStatistics();
|
|
410
|
-
|
|
411
|
-
// Grundlegende Statistiken
|
|
412
|
-
const count = stats.count(); // 10n
|
|
413
|
-
const max = stats.maximum(); // Optional.of(10)
|
|
414
|
-
const min = stats.minimum(); // Optional.of(1)
|
|
415
|
-
const range = stats.range(); // 9
|
|
416
|
-
const mean = stats.mean(); // 5.5
|
|
417
|
-
const median = stats.median(); // 5.5
|
|
418
|
-
const sum = stats.summate(); // 55
|
|
419
|
-
|
|
420
|
-
// Erweiterte Statistiken
|
|
421
|
-
const variance = stats.variance(); // 8.25
|
|
422
|
-
const stdDev = stats.standardDeviation(); // 2.872
|
|
423
|
-
const mode = stats.mode(); // Irgendein Wert (da alle einmal erscheinen)
|
|
424
|
-
const q1 = stats.quantile(0.25); // 3.25
|
|
425
|
-
const q3 = stats.quantile(0.75); // 7.75
|
|
426
|
-
const iqr = stats.interquartileRange(); // 4.5
|
|
427
|
-
|
|
428
|
-
// Häufigkeitsverteilung
|
|
429
|
-
const freq = stats.frequency(); // Map {1 => 1n, 2 => 1n, ...}
|
|
393
|
+
// Wenn Elementreihenfolge beibehalten werden muss
|
|
394
|
+
const ordered = data
|
|
395
|
+
.sorted(comparator) // Sortierung überschreibt Umleitungseffekte
|
|
396
|
+
.toOrdered(); // Beibehaltung der Reihenfolge
|
|
430
397
|
```
|
|
431
398
|
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
**NumericStatistics<E>**
|
|
435
|
-
- Verarbeitet number-Typ statistische Analyse
|
|
436
|
-
- Alle statistischen Berechnungen geben number-Typ zurück
|
|
437
|
-
|
|
438
|
-
**BigIntStatistics<E>**
|
|
439
|
-
- Verarbeitet bigint-Typ statistische Analyse
|
|
440
|
-
- Alle statistischen Berechnungen geben bigint-Typ zurück
|
|
441
|
-
|
|
442
|
-
**Code-Beispiel-Ergänzung:**
|
|
399
|
+
### Fenster-Collector wählen (Fensteroperationen)
|
|
443
400
|
```typescript
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
console.log(numericStats.mean()); // 30
|
|
451
|
-
console.log(numericStats.summate()); // 150
|
|
452
|
-
|
|
453
|
-
// Big Integer Statistiken
|
|
454
|
-
const bigintData = from([100n, 200n, 300n, 400n, 500n]);
|
|
455
|
-
const bigintStats = bigintData.toBigIntStatistics();
|
|
456
|
-
|
|
457
|
-
console.log(bigintStats.mean()); // 300n
|
|
458
|
-
console.log(bigintStats.summate()); // 1500n
|
|
401
|
+
// Bei Fensteroperationsbedarf
|
|
402
|
+
const windowed = data
|
|
403
|
+
.toWindow()
|
|
404
|
+
.slide(5n, 2n); // Gleitendes Fenster
|
|
405
|
+
```
|
|
459
406
|
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
{ value: 45 }
|
|
466
|
-
]);
|
|
407
|
+
### Statistische Analyse wählen (Numerische Berechnungen)
|
|
408
|
+
```typescript
|
|
409
|
+
// Bei statistischem Analysebedarf
|
|
410
|
+
const stats = data
|
|
411
|
+
.toNumericStatistics(); // Numerische Statistik
|
|
467
412
|
|
|
468
|
-
const
|
|
469
|
-
|
|
470
|
-
const sumWithMapper = objectStats.summate(obj => obj.value); // 120
|
|
413
|
+
const bigIntStats = data
|
|
414
|
+
.toBigintStatistics(); // BigInt-Statistik
|
|
471
415
|
```
|
|
472
416
|
|
|
473
|
-
|
|
417
|
+
[GitHub](https://github.com/eloyhere/semantic-typescript)
|
|
418
|
+
[NPMJS](https://www.npmjs.com/package/semantic-typescript)
|
|
474
419
|
|
|
475
|
-
|
|
476
|
-
import { from, validate, invalidate } from 'semantic-typescript';
|
|
477
|
-
|
|
478
|
-
// 1. Erstelle Datenstrom
|
|
479
|
-
const rawData = [5, 2, 8, 1, null, 9, 3, undefined, 7, 4, 6];
|
|
480
|
-
const semanticStream = from(rawData);
|
|
481
|
-
|
|
482
|
-
// 2. Stream-Verarbeitungspipeline
|
|
483
|
-
const processedStream = semanticStream
|
|
484
|
-
.filter(val => validate(val)) // Filtere null und undefined heraus
|
|
485
|
-
.map(val => val! * 2) // Multipliziere jeden Wert mit 2 (verwende !, da validate sicherstellt, dass nicht leer)
|
|
486
|
-
.distinct(); // Entferne Duplikate
|
|
487
|
-
|
|
488
|
-
// 3. Konvertiere zu Collectable und verwende Terminaloperationen
|
|
489
|
-
const collectable = processedStream.toUnordered();
|
|
490
|
-
|
|
491
|
-
// 4. Datenvalidierung und Verwendung
|
|
492
|
-
if (!collectable.isEmpty()) {
|
|
493
|
-
const results = collectable
|
|
494
|
-
.filter(x => x > 5) // Filtere erneut
|
|
495
|
-
.toArray(); // Konvertiere zu Array
|
|
496
|
-
|
|
497
|
-
console.log("Verarbeitungsergebnisse:", results); // [16, 18, 14, 8, 12]
|
|
498
|
-
|
|
499
|
-
// Statistische Informationen
|
|
500
|
-
const stats = processedStream.toNumericStatistics();
|
|
501
|
-
console.log("Mittelwert:", stats.mean()); // 11.2
|
|
502
|
-
console.log("Gesamtsumme:", stats.summate()); // 56
|
|
503
|
-
}
|
|
420
|
+
## Wichtige Hinweise
|
|
504
421
|
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
console.log("Gültige Daten:", validData); // [1, 3, 4]
|
|
511
|
-
console.log("Ungültige Daten:", invalidData); // [null, null]
|
|
512
|
-
```
|
|
422
|
+
1. **Auswirkungen von Sortieroperationen**: In geordneten Collectors überschreibt `sorted()` die Effekte von `redirect`, `translate`, `shuffle`, `reverse`
|
|
423
|
+
2. **Leistungsüberlegungen**: Bei fehlender Reihenfolgeanforderung priorisiert `toUnoredered()` verwenden
|
|
424
|
+
3. **Speichernutzung**: Sortieroperationen benötigen O(n) zusätzlichen Speicher
|
|
425
|
+
4. **Echtzeitdaten**: Semantic-Streams eignen sich für Echtzeitdaten und unterstützen asynchrone Datenquellen
|
|
513
426
|
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
1. **Erstelle Stream**: Verwende `from()`, `range()`, `fill()` etc. Factory-Methoden, um Semantic-Instanzen zu erstellen
|
|
517
|
-
2. **Stream-Transformation**: Rufe `map()`, `filter()`, `distinct()` etc. Methoden auf Semantic-Instanzen auf
|
|
518
|
-
3. **Konvertiere zu Collectable**: Muss eine der folgenden Methoden durch Semantic-Instanz aufrufen:
|
|
519
|
-
- `toOrdered()` - Geordneter Collector
|
|
520
|
-
- `toUnordered()` - Ungeordneter Collector (schnellste)
|
|
521
|
-
- `toWindow()` - Fenster-Collector
|
|
522
|
-
- `toNumericStatistics()` - Numerische Statistiken
|
|
523
|
-
- `toBigIntStatistics()` - Big Integer Statistiken
|
|
524
|
-
- `sorted()` - Natürliche Sortierung
|
|
525
|
-
- `sorted(comparator)` - Benutzerdefinierte Sortierung
|
|
526
|
-
4. **Terminaloperationen**: Rufe `toArray()`, `count()`, `summate()` etc. Terminalmethoden auf Collectable-Instanzen auf
|
|
527
|
-
5. **Datenvalidierung**: Verwende `validate()` um sicherzustellen, dass Daten nicht null/undefined sind, verwende `invalidate()` um ungültige Daten zu prüfen
|
|
528
|
-
|
|
529
|
-
Dieses Design gewährleistet Typsicherheit und Leistungsoptimierung, während es gleichzeitig reichhaltige Stream-Verarbeitungsfunktionalität bietet.
|
|
427
|
+
Diese Bibliothek bietet TypeScript-Entwicklern leistungsstarke und flexible Stream-Verarbeitungsfähigkeiten, die die Vorteile der funktionalen Programmierung mit Typsicherheit kombinieren.
|