semantic-typescript 0.2.6 → 0.2.9
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/factory.d.ts +2 -1
- package/dist/factory.js +46 -26
- package/dist/guard.d.ts +3 -1
- package/dist/guard.js +12 -0
- package/dist/hook.d.ts +2 -0
- package/dist/hook.js +36 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.js +5 -5
- package/dist/optional.d.ts +2 -0
- package/dist/optional.js +11 -0
- package/dist/semantic.d.ts +1 -1
- package/dist/semantic.js +1 -1
- package/dist/utility.d.ts +7 -0
- package/package.json +1 -1
- package/readme.cn.md +166 -151
- package/readme.de.md +292 -283
- package/readme.es.md +244 -241
- package/readme.fr.md +246 -235
- package/readme.jp.md +280 -268
- package/readme.kr.md +254 -248
- package/readme.md +85 -67
- package/readme.ru.md +239 -242
- package/readme.tw.md +245 -244
package/readme.de.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# Semantic-TypeScript Stream
|
|
1
|
+
# Semantic-TypeScript Stream Processing Library
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## Einleitung
|
|
4
4
|
|
|
5
|
-
Semantic-TypeScript ist eine moderne Stream-Verarbeitungsbibliothek,
|
|
5
|
+
Semantic-TypeScript ist eine moderne Stream-Verarbeitungsbibliothek, inspiriert von JavaScript GeneratorFunction, Java Stream und MySQL Index. Seine Kernphilosophie basiert auf dem Aufbau effizienter Datenverarbeitungspipelines mit Hilfe von Datenindizierung und bietet eine typsichere, funktionsbasierte Streaming-Benutzererfahrung für Frontend-Entwicklung.
|
|
6
6
|
|
|
7
|
-
Im Gegensatz zur traditionellen synchronen Verarbeitung verwendet Semantic
|
|
7
|
+
Im Gegensatz zur traditionellen synchronen Verarbeitung verwendet Semantic ein asynchrones Verarbeitungsmodell. Beim Erstellen eines Datenstroms hängt die Zeit, zu der das Terminal Daten empfängt, vollständig davon ab, wann der Upstream die `accept`- und `interrupt`-Callback-Funktionen aufruft. Dieses Design ermöglicht es der Bibliothek, Echtzeitdatenströme, große Datensätze und asynchrone Datenquellen elegant zu verarbeiten.
|
|
8
8
|
|
|
9
9
|
## Installation
|
|
10
10
|
|
|
@@ -12,393 +12,405 @@ Im Gegensatz zur traditionellen synchronen Verarbeitung verwendet Semantic einen
|
|
|
12
12
|
npm install semantic-typescript
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
##
|
|
15
|
+
## Grundlegende Typen
|
|
16
16
|
|
|
17
17
|
| Typ | Beschreibung |
|
|
18
18
|
|------|-------------|
|
|
19
|
-
| `Invalid<T>` |
|
|
20
|
-
| `Valid<T>` |
|
|
21
|
-
| `MaybeInvalid<T>` |
|
|
22
|
-
| `Primitive` | Sammlung
|
|
23
|
-
| `MaybePrimitive<T>` |
|
|
24
|
-
| `OptionalSymbol` |
|
|
25
|
-
| `SemanticSymbol` |
|
|
26
|
-
| `CollectorsSymbol` |
|
|
27
|
-
| `CollectableSymbol` |
|
|
28
|
-
| `OrderedCollectableSymbol` |
|
|
29
|
-
| `WindowCollectableSymbol` |
|
|
30
|
-
| `StatisticsSymbol` |
|
|
31
|
-
| `NumericStatisticsSymbol` |
|
|
32
|
-
| `BigIntStatisticsSymbol` |
|
|
33
|
-
| `UnorderedCollectableSymbol` |
|
|
34
|
-
|
|
35
|
-
##
|
|
19
|
+
| `Invalid<T>` | Typ, der sich von `null` oder `undefined` ableitet |
|
|
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 primitiver Typ sein kann |
|
|
24
|
+
| `OptionalSymbol` | Symbolbezeichner der `Optional`-Klasse |
|
|
25
|
+
| `SemanticSymbol` | Symbolbezeichner der `Semantic`-Klasse |
|
|
26
|
+
| `CollectorsSymbol` | Symbolbezeichner der `Collector`-Klasse |
|
|
27
|
+
| `CollectableSymbol` | Symbolbezeichner der `Collectable`-Klasse |
|
|
28
|
+
| `OrderedCollectableSymbol` | Symbolbezeichner der `OrderedCollectable`-Klasse |
|
|
29
|
+
| `WindowCollectableSymbol` | Symbolbezeichner der `WindowCollectable`-Klasse |
|
|
30
|
+
| `StatisticsSymbol` | Symbolbezeichner der `Statistics`-Klasse |
|
|
31
|
+
| `NumericStatisticsSymbol` | Symbolbezeichner der `NumericStatistics`-Klasse |
|
|
32
|
+
| `BigIntStatisticsSymbol` | Symbolbezeichner der `BigIntStatistics`-Klasse |
|
|
33
|
+
| `UnorderedCollectableSymbol` | Symbolbezeichner der `UnorderedCollectable`-Klasse |
|
|
34
|
+
|
|
35
|
+
## Funktionsorientierte Schnittstellen
|
|
36
36
|
|
|
37
37
|
| Schnittstelle | Beschreibung |
|
|
38
|
-
|
|
39
|
-
| `Runnable` | Funktion ohne Parameter und Rückgabewert |
|
|
40
|
-
| `Supplier<R>` | Funktion ohne Parameter,
|
|
41
|
-
| `Functional<T, R>` | Einzelparameter-
|
|
42
|
-
| `BiFunctional<T, U, R>` | Zweiparameter-
|
|
43
|
-
| `TriFunctional<T, U, V, R>` | Dreiparameter-
|
|
44
|
-
| `Predicate<T>` | Einzelparameter-
|
|
45
|
-
| `BiPredicate<T, U>` | Zweiparameter-
|
|
46
|
-
| `TriPredicate<T, U, V>` | Dreiparameter-
|
|
47
|
-
| `Consumer<T>` | Einzelparameter-
|
|
48
|
-
| `BiConsumer<T, U>` | Zweiparameter-
|
|
49
|
-
| `TriConsumer<T, U, V>` | Dreiparameter-
|
|
38
|
+
|-----------|-------------|
|
|
39
|
+
| `Runnable` | Funktion ohne Parameter und ohne Rückgabewert |
|
|
40
|
+
| `Supplier<R>` | Funktion ohne Parameter, die `R` zurückgibt |
|
|
41
|
+
| `Functional<T, R>` | Einzelparameter-Transformationsfunktion |
|
|
42
|
+
| `BiFunctional<T, U, R>` | Zweiparameter-Transformationsfunktion |
|
|
43
|
+
| `TriFunctional<T, U, V, R>` | Dreiparameter-Transformationsfunktion |
|
|
44
|
+
| `Predicate<T>` | Einzelparameter-Prädikatfunktion |
|
|
45
|
+
| `BiPredicate<T, U>` | Zweiparameter-Prädikatfunktion |
|
|
46
|
+
| `TriPredicate<T, U, V>` | Dreiparameter-Prädikatfunktion |
|
|
47
|
+
| `Consumer<T>` | Einzelparameter-Consumerfunktion |
|
|
48
|
+
| `BiConsumer<T, U>` | Zweiparameter-Consumerfunktion |
|
|
49
|
+
| `TriConsumer<T, U, V>` | Dreiparameter-Consumerfunktion |
|
|
50
50
|
| `Comparator<T>` | Zweiparameter-Vergleichsfunktion |
|
|
51
51
|
| `Generator<T>` | Generatorfunktion (Kern und Basis) |
|
|
52
52
|
|
|
53
53
|
```typescript
|
|
54
|
-
//
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
54
|
+
// Beispiel für die Verwendung von Typen
|
|
55
|
+
let predicate: Predicate<number> = (n: number): boolean => n > 0;
|
|
56
|
+
let mapper: Functional<string, number> = (text: string): number => text.length;
|
|
57
|
+
let comparator: Comparator<number> = (a: number, b: number): number => a - b;
|
|
58
58
|
```
|
|
59
59
|
|
|
60
|
-
##
|
|
61
|
-
|
|
62
|
-
| Funktion | Beschreibung | Zeitkomplexität |
|
|
63
|
-
|
|
64
|
-
| `validate<T>(t: MaybeInvalid<T>): t is T` |
|
|
65
|
-
| `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` |
|
|
66
|
-
| `isBoolean(t: unknown): t is boolean` |
|
|
67
|
-
| `isString(t: unknown): t is string` |
|
|
68
|
-
| `isNumber(t: unknown): t is number` |
|
|
69
|
-
| `isFunction(t: unknown): t is Function` |
|
|
70
|
-
| `isObject(t: unknown): t is object` |
|
|
71
|
-
| `isSymbol(t: unknown): t is symbol` |
|
|
72
|
-
| `isBigint(t: unknown): t is bigint` |
|
|
73
|
-
| `isPrimitive(t: unknown): t is Primitive` |
|
|
74
|
-
| `isIterable(t: unknown): t is Iterable<unknown>` |
|
|
75
|
-
| `isOptional(t: unknown): t is Optional<unknown>` |
|
|
76
|
-
| `isSemantic(t: unknown): t is Semantic<unknown>` |
|
|
77
|
-
| `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` |
|
|
78
|
-
| `isCollectable(t: unknown): t is Collectable<unknown>` |
|
|
79
|
-
| `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` |
|
|
80
|
-
| `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` |
|
|
81
|
-
| `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` |
|
|
82
|
-
| `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` |
|
|
83
|
-
| `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` |
|
|
84
|
-
| `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` |
|
|
60
|
+
## Typguards
|
|
61
|
+
|
|
62
|
+
| Funktion | Beschreibung | Zeitkomplexität | Speicherplatzkomplexität |
|
|
63
|
+
|------|------|------------|------------|
|
|
64
|
+
| `validate<T>(t: MaybeInvalid<T>): t is T` | Überprüft, ob der Wert nicht null oder undefined ist | O(1) | O(1) |
|
|
65
|
+
| `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | Überprüft, ob der Wert null oder undefined ist | O(1) | O(1) |
|
|
66
|
+
| `isBoolean(t: unknown): t is boolean` | Überprüft, ob es sich um einen booleschen Wert handelt | O(1) | O(1) |
|
|
67
|
+
| `isString(t: unknown): t is string` | Überprüft, ob es sich um einen String handelt | O(1) | O(1) |
|
|
68
|
+
| `isNumber(t: unknown): t is number` | Überprüft, ob es sich um eine Zahl handelt | O(1) | O(1) |
|
|
69
|
+
| `isFunction(t: unknown): t is Function` | Überprüft, ob es sich um eine Funktion handelt | O(1) | O(1) |
|
|
70
|
+
| `isObject(t: unknown): t is object` | Überprüft, ob es sich um ein Objekt handelt | O(1) | O(1) |
|
|
71
|
+
| `isSymbol(t: unknown): t is symbol` | Überprüft, ob es sich um ein Symbol handelt | O(1) | O(1) |
|
|
72
|
+
| `isBigint(t: unknown): t is bigint` | Überprüft, ob es sich um ein BigInt handelt | O(1) | O(1) |
|
|
73
|
+
| `isPrimitive(t: unknown): t is Primitive` | Überprüft, ob es sich um einen primitiven Typ handelt | O(1) | O(1) |
|
|
74
|
+
| `isIterable(t: unknown): t is Iterable<unknown>` | Überprüft, ob es sich um ein iterierbares Objekt handelt | O(1) | O(1) |
|
|
75
|
+
| `isOptional(t: unknown): t is Optional<unknown>` | Überprüft, ob es sich um eine Optional-Instanz handelt | O(1) | O(1) |
|
|
76
|
+
| `isSemantic(t: unknown): t is Semantic<unknown>` | Überprüft, ob es sich um eine Semantic-Instanz handelt | O(1) | O(1) |
|
|
77
|
+
| `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | Überprüft, ob es sich um eine Collector-Instanz handelt | O(1) | O(1) |
|
|
78
|
+
| `isCollectable(t: unknown): t is Collectable<unknown>` | Überprüft, ob es sich um eine Collectable-Instanz handelt | O(1) | O(1) |
|
|
79
|
+
| `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | Überprüft, ob es sich um eine OrderedCollectable-Instanz handelt | O(1) | O(1) |
|
|
80
|
+
| `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | Überprüft, ob es sich um eine WindowCollectable-Instanz handelt | O(1) | O(1) |
|
|
81
|
+
| `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | Überprüft, ob es sich um eine UnorderedCollectable-Instanz handelt | O(1) | O(1) |
|
|
82
|
+
| `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | Überprüft, ob es sich um eine Statistics-Instanz handelt | O(1) | O(1) |
|
|
83
|
+
| `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | Überprüft, ob es sich um eine NumericStatistics-Instanz handelt | O(1) | O(1) |
|
|
84
|
+
| `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | Überprüft, ob es sich um eine BigIntStatistics-Instanz handelt | O(1) | O(1) |
|
|
85
|
+
| `isPromise(t: unknown): t is Promise<unknown>` | Überprüft, ob es sich um ein Promise-Objekt handelt | O(1) | O(1) |
|
|
86
|
+
| `isAsync(t: unknown): t is AsyncFunction` | Überprüft, ob es sich um eine AsyncFunction handelt | O(1) | O(1) |
|
|
85
87
|
|
|
86
88
|
```typescript
|
|
87
|
-
//
|
|
88
|
-
|
|
89
|
+
// Beispiel für die Verwendung von Typguards
|
|
90
|
+
let value: unknown = "hello";
|
|
89
91
|
|
|
90
92
|
if (isString(value)) {
|
|
91
|
-
console.log(value.length); // Typsicher, value wird als string
|
|
93
|
+
console.log(value.length); // Typsicher, value wird als string abgeleitet
|
|
92
94
|
}
|
|
93
95
|
|
|
94
96
|
if (isOptional(someValue)) {
|
|
95
|
-
someValue.ifPresent(
|
|
97
|
+
someValue.ifPresent((value): void => console.log(val));
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if(isIterable(value)){
|
|
101
|
+
// Typsicher, jetzt ist es ein iterierbares Objekt.
|
|
102
|
+
for(let item of value){
|
|
103
|
+
console.log(item);
|
|
104
|
+
}
|
|
96
105
|
}
|
|
97
106
|
```
|
|
98
107
|
|
|
99
108
|
## Hilfsfunktionen
|
|
100
109
|
|
|
101
|
-
| Funktion | Beschreibung | Zeitkomplexität |
|
|
102
|
-
|
|
110
|
+
| Funktion | Beschreibung | Zeitkomplexität | Speicherplatzkomplexität |
|
|
111
|
+
|------|------|------------|------------|
|
|
103
112
|
| `useCompare<T>(t1: T, t2: T): number` | Allgemeine Vergleichsfunktion | O(1) | O(1) |
|
|
104
113
|
| `useRandom<T = number \| bigint>(index: T): T` | Pseudozufallszahlengenerator | O(log n) | O(1) |
|
|
105
114
|
|
|
106
115
|
```typescript
|
|
107
|
-
//
|
|
108
|
-
|
|
116
|
+
// Beispiel für die Verwendung von Hilfsfunktionen
|
|
117
|
+
let numbers: Array<number> = [3, 1, 4, 1, 5];
|
|
109
118
|
numbers.sort(useCompare); // [1, 1, 3, 4, 5]
|
|
110
119
|
|
|
111
|
-
|
|
112
|
-
const randomBigInt = useRandom(1000n); // BigInt-Zufallszahl
|
|
120
|
+
let randomNum = useRandom(42); // Saat-basierter Zufallszahl
|
|
113
121
|
```
|
|
114
122
|
|
|
115
123
|
## Fabrikmethoden
|
|
116
124
|
|
|
117
|
-
###
|
|
125
|
+
### Optionale Fabrikmethoden
|
|
118
126
|
|
|
119
|
-
| Methode | Beschreibung | Zeitkomplexität |
|
|
120
|
-
|
|
121
|
-
| `Optional.empty<T>()` | Erstellt
|
|
122
|
-
| `Optional.of<T>(value)` | Erstellt Optional
|
|
123
|
-
| `Optional.ofNullable<T>(value)` | Erstellt
|
|
124
|
-
| `Optional.ofNonNull<T>(value)` | Erstellt nicht-null Optional | O(1) | O(1) |
|
|
127
|
+
| Methode | Beschreibung | Zeitkomplexität | Speicherplatzkomplexität |
|
|
128
|
+
|------|------|------------|------------|
|
|
129
|
+
| `Optional.empty<T>()` | Erstellt eine leere Optional | O(1) | O(1) |
|
|
130
|
+
| `Optional.of<T>(value)` | Erstellt eine Optional, die einen Wert enthält | O(1) | O(1) |
|
|
131
|
+
| `Optional.ofNullable<T>(value)` | Erstellt eine potenziell leere Optional | O(1) | O(1) |
|
|
132
|
+
| `Optional.ofNonNull<T>(value)` | Erstellt eine nicht-null Optional | O(1) | O(1) |
|
|
125
133
|
|
|
126
134
|
```typescript
|
|
127
|
-
// Optional
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
console.log(
|
|
135
|
+
// Beispiele für die Verwendung von Optional
|
|
136
|
+
let empty: Optional<number> = Optional.empty();
|
|
137
|
+
let present: Optional<number> = Optional.of(42);
|
|
138
|
+
let nullable: Optional<string> = Optional.ofNullable<string>(null);
|
|
139
|
+
let nonNull: Optional<string> = Optional.ofNonNull("hello");
|
|
140
|
+
|
|
141
|
+
present.ifPresent((value: number): void => console.log(value)); // Gibt 42 aus
|
|
142
|
+
console.log(empty.get(100)); // Gibt 100 aus
|
|
135
143
|
```
|
|
136
144
|
|
|
137
|
-
### Collector
|
|
145
|
+
### Collector Fabrikmethoden
|
|
138
146
|
|
|
139
|
-
| Methode | Beschreibung | Zeitkomplexität |
|
|
140
|
-
|
|
141
|
-
| `Collector.full(identity, accumulator, finisher)` | Erstellt vollständigen Collector | O(1) | O(1) |
|
|
142
|
-
| `Collector.shortable(identity, interruptor, accumulator, finisher)` | Erstellt unterbrechbaren Collector | O(1) | O(1) |
|
|
147
|
+
| Methode | Beschreibung | Zeitkomplexität | Speicherplatzkomplexität |
|
|
148
|
+
|------|------|------------|------------|
|
|
149
|
+
| `Collector.full(identity, accumulator, finisher)` | Erstellt einen vollständigen Collector | O(1) | O(1) |
|
|
150
|
+
| `Collector.shortable(identity, interruptor, accumulator, finisher)` | Erstellt einen unterbrechbaren Collector | O(1) | O(1) |
|
|
143
151
|
|
|
144
152
|
```typescript
|
|
145
|
-
// Beispiele für
|
|
146
|
-
|
|
153
|
+
// Beispiele für die Konvertierung von Collectors
|
|
154
|
+
let numbers: Semantic<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
|
|
147
155
|
|
|
148
|
-
// Leistung zuerst:
|
|
149
|
-
|
|
150
|
-
.filter(n => n > 3)
|
|
151
|
-
.
|
|
156
|
+
// Leistung zuerst: verwenden Sie den ungeordneten Collector
|
|
157
|
+
let unordered: UnorderedCollectable<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5])
|
|
158
|
+
.filter((n: number): boolean => n > 3)
|
|
159
|
+
.toUnordered();
|
|
152
160
|
|
|
153
|
-
// Sortierung
|
|
154
|
-
|
|
161
|
+
// Sortierung erforderlich: verwenden Sie den geordneten Collector
|
|
162
|
+
let ordered: OrderedCollectable<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5])
|
|
163
|
+
.sorted();
|
|
155
164
|
|
|
156
165
|
// Zählt die Anzahl der Elemente
|
|
157
|
-
let count = Collector.full(
|
|
158
|
-
() => 0, // Anfangswert
|
|
159
|
-
(accumulator, element) => accumulator + element, // Akkumulieren
|
|
160
|
-
(accumulator) => accumulator //
|
|
166
|
+
let count: Collector<number, number, number> = Collector.full(
|
|
167
|
+
(): number => 0, // Anfangswert
|
|
168
|
+
(accumulator: number, element: number): number => accumulator + element, // Akkumulieren
|
|
169
|
+
(accumulator: number): number => accumulator // Fertigstellen
|
|
161
170
|
);
|
|
162
171
|
count.collect(from([1,2,3,4,5])); // Zählt aus einem Stream
|
|
163
|
-
count.collect([1,2,3,4,5]); // Zählt aus einem
|
|
172
|
+
count.collect([1,2,3,4,5]); // Zählt aus einem iterierbaren Objekt
|
|
164
173
|
|
|
165
|
-
let find = Collector.shortable(
|
|
166
|
-
() => Optional.empty(), // Anfangswert
|
|
167
|
-
(element, index, accumulator) => accumulator.isPresent(), // Unterbrechen
|
|
168
|
-
(accumulator
|
|
169
|
-
(accumulator) => accumulator //
|
|
174
|
+
let find: Optional<number> = Collector.shortable(
|
|
175
|
+
(): Optional<number> => Optional.empty(), // Anfangswert
|
|
176
|
+
(element: number, index: bigint, accumulator: Optional<number>): Optional<number> => accumulator.isPresent(), // Unterbrechen
|
|
177
|
+
(accumulator: Optional<number>, element: number, index: bigint): Optional<number> => Optional.of(element), // Akkumulieren
|
|
178
|
+
(accumulator: Optional<number>): Optional<number> => accumulator // Fertigstellen
|
|
170
179
|
);
|
|
171
180
|
find.collect(from([1,2,3,4,5])); // Findet das erste Element
|
|
172
181
|
find.collect([1,2,3,4,5]); // Findet das erste Element
|
|
173
182
|
```
|
|
174
183
|
|
|
175
|
-
### Semantic
|
|
184
|
+
### Semantic Fabrikmethoden
|
|
176
185
|
|
|
177
|
-
| Methode | Beschreibung | Zeitkomplexität |
|
|
178
|
-
|
|
179
|
-
| `
|
|
180
|
-
| `
|
|
181
|
-
| `
|
|
182
|
-
| `
|
|
183
|
-
| `
|
|
184
|
-
| `interval(period, delay?)` |
|
|
185
|
-
| `iterate<E>(generator)` |
|
|
186
|
-
| `range(start, end, step)` |
|
|
187
|
-
| `websocket(websocket)` |
|
|
186
|
+
| Methode | Beschreibung | Zeitkomplexität | Speicherplatzkomplexität |
|
|
187
|
+
|------|------|------------|------------|
|
|
188
|
+
| `animationFrame(period: number, delay: number = 0)` | Erstellt einen zeitgesteuerten Animationsframe-Stream | O(1)* | O(1) |
|
|
189
|
+
| `blob(blob, chunkSize)` | Erstellt einen Stream aus einem Blob | O(n) | O(chunkSize) |
|
|
190
|
+
| `empty<E>()` | Erstellt einen leeren Stream | O(1) | O(1) |
|
|
191
|
+
| `fill<E>(element, count)` | Erstellt einen gefüllten Stream | O(n) | O(1) |
|
|
192
|
+
| `from<E>(iterable)` | Erstellt einen Stream aus einem iterierbaren Objekt | O(1) | O(1) |
|
|
193
|
+
| `interval(period, delay?)` | Erstellt einen zeitgesteuerten Intervall-Stream | O(1)* | O(1) |
|
|
194
|
+
| `iterate<E>(generator)` | Erstellt einen Stream aus einem Generator | O(1) | O(1) |
|
|
195
|
+
| `range(start, end, step)` | Erstellt einen numerischen Bereichs-Stream | O(n) | O(1) |
|
|
196
|
+
| `websocket(websocket)` | Erstellt einen Stream aus einem WebSocket | O(1) | O(1) |
|
|
188
197
|
|
|
189
198
|
```typescript
|
|
190
|
-
//
|
|
199
|
+
// Beispiele für die Verwendung von Semantic Fabrikmethoden
|
|
200
|
+
|
|
201
|
+
// Erstellt einen Stream aus einem zeitgesteuerten Animationsframe
|
|
202
|
+
animationFrame(1000)
|
|
203
|
+
.toUnordered()
|
|
204
|
+
.forEach(frame => console.log(frame));
|
|
191
205
|
|
|
192
|
-
// Stream aus Blob
|
|
206
|
+
// Erstellt einen Stream aus einem Blob (chunked reading)
|
|
193
207
|
blob(someBlob, 1024n)
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
208
|
+
.toUnordered()
|
|
209
|
+
.write(WritableStream)
|
|
210
|
+
.then(callback) // Schreiben des Streams erfolgreich
|
|
211
|
+
.catch(callback); // Schreiben des Streams fehlgeschlagen
|
|
198
212
|
|
|
199
|
-
//
|
|
213
|
+
// Erstellt einen leeren Stream, der erst ausgeführt wird, wenn er mit anderen Streams verkettet wird
|
|
200
214
|
empty<string>()
|
|
201
|
-
|
|
202
|
-
|
|
215
|
+
.toUnordered()
|
|
216
|
+
.join(); //[]
|
|
203
217
|
|
|
204
|
-
//
|
|
205
|
-
|
|
218
|
+
// Erstellt einen gefüllten Stream
|
|
219
|
+
let filledStream = fill("hello", 3); // "hello", "hello", "hello"
|
|
206
220
|
|
|
207
|
-
//
|
|
208
|
-
|
|
209
|
-
const intervalStream = interval(5000, 2000);
|
|
221
|
+
// Erstellt einen zeitgesteuerten Stream mit einer anfänglichen Verzögerung von 2 Sekunden und einer Ausführungsperiode von 5 Sekunden, implementiert auf der Grundlage eines Timer-Mechanismus; kann aufgrund von Systemplanungsgenauigkeitsbeschränkungen zu Zeitdrift führen.
|
|
222
|
+
let intervalStream = interval(5000, 2000);
|
|
210
223
|
|
|
211
|
-
// Stream aus
|
|
212
|
-
|
|
213
|
-
|
|
224
|
+
// Erstellt einen Stream aus einem iterierbaren Objekt
|
|
225
|
+
let numberStream = from([1, 2, 3, 4, 5]);
|
|
226
|
+
let stringStream = from(new Set(["Alex", "Bob"]));
|
|
214
227
|
|
|
215
|
-
// Bereichs-Stream
|
|
216
|
-
|
|
228
|
+
// Erstellt einen Bereichs-Stream
|
|
229
|
+
let rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
217
230
|
|
|
218
|
-
// WebSocket-
|
|
219
|
-
|
|
231
|
+
// WebSocket-Ereignis-Stream
|
|
232
|
+
let ws = new WebSocket("ws://localhost:8080");
|
|
220
233
|
websocket(ws)
|
|
221
|
-
.filter((event)=> event.type === "message") // Nur Nachrichtenereignisse
|
|
222
|
-
.toUnordered() //
|
|
223
|
-
.forEach((event)=> receive(event)); // Nachrichten empfangen
|
|
234
|
+
.filter((event): boolean => event.type === "message"); // Nur Nachrichtenereignisse abhören
|
|
235
|
+
.toUnordered() // Ereignisse sind in der Regel nicht geordnet
|
|
236
|
+
.forEach((event): void => receive(event)); // Nachrichten empfangen
|
|
224
237
|
```
|
|
225
238
|
|
|
226
|
-
## Semantic
|
|
239
|
+
## Semantic Klassenmethoden
|
|
227
240
|
|
|
228
|
-
| Methode | Beschreibung | Zeitkomplexität |
|
|
229
|
-
|
|
241
|
+
| Methode | Beschreibung | Zeitkomplexität | Speicherplatzkomplexität |
|
|
242
|
+
|------|------|------------|------------|
|
|
230
243
|
| `concat(other)` | Verbindet zwei Streams | O(n) | O(1) |
|
|
231
244
|
| `distinct()` | Entfernt Duplikate | O(n) | O(n) |
|
|
232
|
-
| `distinct(comparator)` | Entfernt Duplikate mit
|
|
233
|
-
| `dropWhile(predicate)` | Verwirft Elemente, die
|
|
245
|
+
| `distinct(comparator)` | Entfernt Duplikate mit einem Vergleichsoperator | O(n²) | O(n) |
|
|
246
|
+
| `dropWhile(predicate)` | Verwirft Elemente, die die Bedingung erfüllen | O(n) | O(1) |
|
|
234
247
|
| `filter(predicate)` | Filtert Elemente | O(n) | O(1) |
|
|
235
|
-
| `flat(mapper)` |
|
|
236
|
-
| `flatMap(mapper)` |
|
|
237
|
-
| `limit(n)` | Begrenzt
|
|
238
|
-
| `map(mapper)` |
|
|
239
|
-
| `peek(consumer)` |
|
|
240
|
-
| `redirect(redirector)` | Index
|
|
241
|
-
| `reverse()` |
|
|
242
|
-
| `shuffle()` |
|
|
243
|
-
| `shuffle(mapper)` |
|
|
244
|
-
| `skip(n)` | Überspringt
|
|
248
|
+
| `flat(mapper)` | Flachemapping | O(n × m) | O(1) |
|
|
249
|
+
| `flatMap(mapper)` | Flachemapping in einen neuen Typ | O(n × m) | O(1) |
|
|
250
|
+
| `limit(n)` | Begrenzt die Anzahl der Elemente | O(n) | O(1) |
|
|
251
|
+
| `map(mapper)` | Zuordnungstransformation | O(n) | O(1) |
|
|
252
|
+
| `peek(consumer)` | Blickt auf Elemente | O(n) | O(1) |
|
|
253
|
+
| `redirect(redirector)` | Leitet den Index um | O(n) | O(1) |
|
|
254
|
+
| `reverse()` | Umkehrt den Stream | O(n) | O(1) |
|
|
255
|
+
| `shuffle()` | Mischt zufällig | O(n) | O(1) |
|
|
256
|
+
| `shuffle(mapper)` | Mischt mit einem Mapper | O(n) | O(1) |
|
|
257
|
+
| `skip(n)` | Überspringt die ersten n Elemente | O(n) | O(1) |
|
|
245
258
|
| `sorted()` | Sortiert | O(n log n) | O(n) |
|
|
246
|
-
| `sorted(comparator)` | Sortiert mit
|
|
247
|
-
| `sub(start, end)` |
|
|
248
|
-
| `takeWhile(predicate)` |
|
|
249
|
-
| `translate(offset)` | Index
|
|
250
|
-
| `translate(translator)` | Index
|
|
259
|
+
| `sorted(comparator)` | Sortiert mit einem Vergleichsoperator | O(n log n) | O(n) |
|
|
260
|
+
| `sub(start, end)` | Holt einen Substream | O(n) | O(1) |
|
|
261
|
+
| `takeWhile(predicate)` | Holt Elemente, die die Bedingung erfüllen | O(n) | O(1) |
|
|
262
|
+
| `translate(offset)` | Übersetzt den Index | O(n) | O(1) |
|
|
263
|
+
| `translate(translator)` | Übersetzt den Index mit einem Translator | O(n) | O(1) |
|
|
251
264
|
|
|
252
265
|
```typescript
|
|
253
|
-
// Semantic-
|
|
254
|
-
|
|
255
|
-
.filter(n => n % 2 === 0) // Filtert gerade Zahlen
|
|
256
|
-
.map(n => n * 2) // Multipliziert mit 2
|
|
257
|
-
.skip(1) // Überspringt
|
|
266
|
+
// Beispiele für Semantic-Operationen
|
|
267
|
+
let result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
268
|
+
.filter((n: number): boolean => n % 2 === 0) // Filtert gerade Zahlen
|
|
269
|
+
.map((n: number): number => n * 2) // Multipliziert mit 2
|
|
270
|
+
.skip(1) // Überspringt das erste
|
|
258
271
|
.limit(3) // Begrenzt auf 3 Elemente
|
|
259
|
-
.toUnordered()
|
|
260
|
-
.toArray(); // Konvertiert
|
|
272
|
+
.toUnordered() // Konvertiert in einen ungeordneten Collector
|
|
273
|
+
.toArray(); // Konvertiert in ein Array
|
|
261
274
|
// Ergebnis: [8, 12, 20]
|
|
262
275
|
|
|
263
|
-
//
|
|
264
|
-
|
|
265
|
-
.flatMap(n => from([n, n * 2])) //
|
|
276
|
+
// Komplexes Operationsexample
|
|
277
|
+
let complexResult = range(1, 100, 1)
|
|
278
|
+
.flatMap((n: number): Semantics<number> => from([n, n * 2])) // Mappt jedes Element auf zwei
|
|
266
279
|
.distinct() // Entfernt Duplikate
|
|
267
|
-
.shuffle() // Mischt
|
|
268
|
-
.takeWhile(n => n < 50) // Nimmt Elemente
|
|
269
|
-
.toOrdered() // Konvertiert
|
|
270
|
-
.toArray(); // Konvertiert
|
|
280
|
+
.shuffle() // Mischt die Reihenfolge
|
|
281
|
+
.takeWhile((n: number): boolean => n < 50) // Nimmt Elemente kleiner als 50
|
|
282
|
+
.toOrdered() // Konvertiert in einen geordneten Collector
|
|
283
|
+
.toArray(); // Konvertiert in ein Array
|
|
271
284
|
```
|
|
272
285
|
|
|
273
|
-
##
|
|
286
|
+
## Semantic Konvertierungsmethoden
|
|
274
287
|
|
|
275
|
-
| Methode | Beschreibung | Zeitkomplexität |
|
|
288
|
+
| Methode | Beschreibung | Zeitkomplexität | Speicherplatzkomplexität |
|
|
276
289
|
|------------|------------|------------|------------|
|
|
277
|
-
| `sorted()` |
|
|
278
|
-
| `toUnordered()` |
|
|
279
|
-
| `toOrdered()` |
|
|
280
|
-
| `toNumericStatistics()` |
|
|
281
|
-
| `toBigintStatistics()` |
|
|
282
|
-
| `toWindow()` |
|
|
283
|
-
| `toCollectable()` |
|
|
284
|
-
| `toCollectable(mapper)` |
|
|
290
|
+
| `sorted()` | Konvertiert in einen geordneten Collector | O(n log n) | O(n) |
|
|
291
|
+
| `toUnordered()` | Konvertiert in einen ungeordneten Collector | O(1) | O(1) |
|
|
292
|
+
| `toOrdered()` | Konvertiert in einen geordneten Collector | O(1) | O(1) |
|
|
293
|
+
| `toNumericStatistics()` | Konvertiert in numerische Statistiken | O(n) | O(1) |
|
|
294
|
+
| `toBigintStatistics()` | Konvertiert in BigInt-Statistiken | O(n) | O(1) |
|
|
295
|
+
| `toWindow()` | Konvertiert in einen Fenstercollector | O(1) | O(1) |
|
|
296
|
+
| `toCollectable()` | Konvertiert in `UnorderdCollectable` | O(n) | O(1) |
|
|
297
|
+
| `toCollectable(mapper)` | Konvertiert in einen benutzerdefinierten Collectable | O(n) | O(1) |
|
|
285
298
|
|
|
286
299
|
```typescript
|
|
287
|
-
//
|
|
300
|
+
// Konvertiert in ein aufsteigend sortiertes Array
|
|
288
301
|
from([6,4,3,5,2]) // Erstellt einen Stream
|
|
289
302
|
.sorted() // Sortiert den Stream in aufsteigender Reihenfolge
|
|
290
303
|
.toArray(); // [2, 3, 4, 5, 6]
|
|
291
304
|
|
|
292
|
-
//
|
|
305
|
+
// Konvertiert in ein absteigend sortiertes Array
|
|
293
306
|
from([6,4,3,5,2]) // Erstellt einen Stream
|
|
294
|
-
.soted((a, b) => b - a) // Sortiert den Stream in absteigender Reihenfolge
|
|
307
|
+
.soted((a: number, b: number): number => b - a) // Sortiert den Stream in absteigender Reihenfolge
|
|
295
308
|
.toArray(); // [6, 5, 4, 3, 2]
|
|
296
309
|
|
|
297
|
-
//
|
|
310
|
+
// Leitet um in ein umgekehrtes Array
|
|
298
311
|
from([6,4,3,5,2])
|
|
299
|
-
.redirect((element, index) => -index) // Leitet in umgekehrter Reihenfolge
|
|
312
|
+
.redirect((element, index): bigint => -index) // Leitet um in umgekehrter Reihenfolge
|
|
300
313
|
.toOrderd() // Behält die umgeleitete Reihenfolge bei
|
|
301
314
|
.toArray(); // [2, 5, 3, 4, 6]
|
|
302
315
|
|
|
303
|
-
// Umleitungen
|
|
316
|
+
// Ignoriert Umleitungen, um ein umgekehrtes Array zu erhalten
|
|
304
317
|
from([6,4,3,5,2])
|
|
305
|
-
.redirect((element, index) => -index) // Leitet in umgekehrter Reihenfolge
|
|
306
|
-
.toUnorderd() //
|
|
318
|
+
.redirect((element: number, index: bigint) => -index) // Leitet um in umgekehrter Reihenfolge
|
|
319
|
+
.toUnorderd() // Ignoriert die umgeleitete Reihenfolge. Diese Operation ignoriert `redirect`, `reverse`, `shuffle` und `translate` Operationen
|
|
307
320
|
.toArray(); // [2, 5, 3, 4, 6]
|
|
308
321
|
|
|
309
|
-
//
|
|
322
|
+
// Kehrt den Stream in ein Array um
|
|
310
323
|
from([6, 4, 3, 5, 2])
|
|
311
324
|
.reverse() // Kehrt den Stream um
|
|
312
325
|
.toOrdered() // Garantiert die umgekehrte Reihenfolge
|
|
313
326
|
.toArray(); // [2, 5, 3, 4, 6]
|
|
314
327
|
|
|
315
|
-
//
|
|
328
|
+
// Überschreibt den gemischten Stream in ein Array
|
|
316
329
|
from([6, 4, 3, 5, 2])
|
|
317
330
|
.shuffle() // Mischt den Stream
|
|
318
|
-
.sorted() // Überschreibt die gemischte Reihenfolge. Diese Operation überschreibt
|
|
331
|
+
.sorted() // Überschreibt die gemischte Reihenfolge. Diese Operation überschreibt `redirect`, `reverse`, `shuffle` und `translate` Operationen
|
|
319
332
|
.toArray(); // [2, 5, 3, 4, 6]
|
|
320
333
|
|
|
321
|
-
//
|
|
334
|
+
// Konvertiert in einen Fenstercollector
|
|
322
335
|
from([6, 4, 3, 5, 2]).toWindow();
|
|
323
336
|
|
|
324
|
-
//
|
|
337
|
+
// Konvertiert in numerische Statistiken
|
|
325
338
|
from([6, 4, 3, 5, 2]).toNumericStatistics();
|
|
326
339
|
|
|
327
|
-
//
|
|
340
|
+
// Konvertiert in BigInt-Statistiken
|
|
328
341
|
from([6n, 4n, 3n, 5n, 2n]).toBigintStatistics();
|
|
329
342
|
|
|
330
|
-
// Definiert einen benutzerdefinierten Collector
|
|
343
|
+
// Definiert einen benutzerdefinierten Collector zum Sammeln von Daten
|
|
331
344
|
let customizedCollector = from([1, 2, 3, 4, 5]).toCollectable((generator: Generator<E>) => new CustomizedCollector(generator));
|
|
332
345
|
```
|
|
333
346
|
|
|
334
|
-
## Collectable
|
|
335
|
-
|
|
336
|
-
| Methode | Beschreibung | Zeitkomplexität |
|
|
337
|
-
|
|
338
|
-
| `anyMatch(predicate)` |
|
|
339
|
-
| `allMatch(predicate)` |
|
|
340
|
-
| `count()` |
|
|
341
|
-
| `isEmpty()` |
|
|
342
|
-
| `findAny()` |
|
|
343
|
-
| `findFirst()` |
|
|
344
|
-
| `findLast()` |
|
|
345
|
-
| `forEach(action)` |
|
|
346
|
-
| `group(classifier)` |
|
|
347
|
-
| `groupBy(keyExtractor, valueExtractor)` |
|
|
348
|
-
| `join()` |
|
|
349
|
-
| `join(delimiter)` |
|
|
350
|
-
| `nonMatch(predicate)` |
|
|
351
|
-
| `partition(count)` |
|
|
352
|
-
| `partitionBy(classifier)` |
|
|
347
|
+
## Collectable Auflistungsmethoden
|
|
348
|
+
|
|
349
|
+
| Methode | Beschreibung | Zeitkomplexität | Speicherplatzkomplexität |
|
|
350
|
+
|------|------|------------|------------|
|
|
351
|
+
| `anyMatch(predicate)` | Ob irgendein Element übereinstimmt | O(n) | O(1) |
|
|
352
|
+
| `allMatch(predicate)` | Ob alle Elemente übereinstimmen | O(n) | O(1) |
|
|
353
|
+
| `count()` | Elementanzahl | O(n) | O(1) |
|
|
354
|
+
| `isEmpty()` | Ob es leer ist | O(1) | O(1) |
|
|
355
|
+
| `findAny()` | Finde ein beliebiges Element | O(n) | O(1) |
|
|
356
|
+
| `findFirst()` | Finde das erste Element | O(n) | O(1) |
|
|
357
|
+
| `findLast()` | Finde das letzte Element | O(n) | O(1) |
|
|
358
|
+
| `forEach(action)` | Durchlaufe alle Elemente | O(n) | O(1) |
|
|
359
|
+
| `group(classifier)` | Gruppiere nach Klassifizierer | O(n) | O(n) |
|
|
360
|
+
| `groupBy(keyExtractor, valueExtractor)` | Gruppiere nach Schlüssel-Wert-Extraktor | O(n) | O(n) |
|
|
361
|
+
| `join()` | Verbinde als Zeichenkette | O(n) | O(n) |
|
|
362
|
+
| `join(delimiter)` | Verbinde mit einem Trennzeichen | O(n) | O(n) |
|
|
363
|
+
| `nonMatch(predicate)` | Ob kein Element übereinstimmt | O(n) | O(1) |
|
|
364
|
+
| `partition(count)` | Partitioniere nach Anzahl | O(n) | O(n) |
|
|
365
|
+
| `partitionBy(classifier)` | Partitioniere nach Klassifizierer | O(n) | O(n) |
|
|
353
366
|
| `reduce(accumulator)` | Reduktionsoperation | O(n) | O(1) |
|
|
354
|
-
| `reduce(identity, accumulator)` |
|
|
355
|
-
| `toArray()` |
|
|
356
|
-
| `toMap(keyExtractor, valueExtractor)` |
|
|
357
|
-
| `toSet()` |
|
|
358
|
-
| `write(stream)` |
|
|
367
|
+
| `reduce(identity, accumulator)` | Reduzierung mit Anfangswert | O(n) | O(1) |
|
|
368
|
+
| `toArray()` | Konvertiere in ein Array | O(n) | O(n) |
|
|
369
|
+
| `toMap(keyExtractor, valueExtractor)` | Konvertiere in eine Map | O(n) | O(n) |
|
|
370
|
+
| `toSet()` | Konvertiere in eine Menge | O(n) | O(n) |
|
|
371
|
+
| `write(stream)` | Schreibe in einen Stream | O(n) | O(1) |
|
|
359
372
|
|
|
360
373
|
```typescript
|
|
361
|
-
// Collectable
|
|
362
|
-
|
|
363
|
-
.filter(n => n % 2 === 0)
|
|
374
|
+
// Collectable Operationsexamples
|
|
375
|
+
let data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
376
|
+
.filter((n: number): boolean => n % 2 === 0)
|
|
364
377
|
.toOrdered();
|
|
365
378
|
|
|
366
|
-
//
|
|
367
|
-
console.log(data.anyMatch(n => n > 5)); // true
|
|
368
|
-
console.log(data.allMatch(n => n < 20)); // true
|
|
379
|
+
// Übereinstimmungsüberprüfungen
|
|
380
|
+
console.log(data.anyMatch((n: number): boolean => n > 5)); // true
|
|
381
|
+
console.log(data.allMatch((n: number): boolean => n < 20)); // true
|
|
369
382
|
|
|
370
|
-
//
|
|
371
|
-
data.findFirst().ifPresent(n => console.log(n)); // 2
|
|
372
|
-
data.findAny().ifPresent(n => console.log(n)); //
|
|
383
|
+
// Suchvorgänge
|
|
384
|
+
data.findFirst().ifPresent((n: number): void => console.log(n)); // 2
|
|
385
|
+
data.findAny().ifPresent((n: number): void => console.log(n)); // Ein beliebiges Element
|
|
373
386
|
|
|
374
|
-
//
|
|
375
|
-
|
|
376
|
-
n => n > 5 ? "
|
|
377
|
-
n => n * 2
|
|
378
|
-
);
|
|
379
|
-
// {small: [4, 8], large: [12, 16, 20]}
|
|
387
|
+
// Gruppierungsvorgänge
|
|
388
|
+
let grouped = data.groupBy(
|
|
389
|
+
(n: number): string => (n > 5 ? "groß" : "klein"),
|
|
390
|
+
(n: number): number => n * 2
|
|
391
|
+
); // {klein: [4, 8], groß: [12, 16, 20]}
|
|
380
392
|
|
|
381
|
-
//
|
|
382
|
-
|
|
393
|
+
// Reduktionsvorgänge
|
|
394
|
+
let sum = data.reduce(0, (acc, n) => acc + n); // 30
|
|
383
395
|
|
|
384
396
|
// Ausgabeoperationen
|
|
385
|
-
data.join(", "); // "2, 4, 6, 8, 10"
|
|
397
|
+
data.join(", "); // "[2, 4, 6, 8, 10]"
|
|
386
398
|
```
|
|
387
399
|
|
|
388
|
-
## Statistische
|
|
400
|
+
## Statistische Analysemethode
|
|
389
401
|
|
|
390
|
-
### NumericStatistics
|
|
402
|
+
### NumericStatistics Methoden
|
|
391
403
|
|
|
392
|
-
| Methode | Beschreibung | Zeitkomplexität |
|
|
393
|
-
|
|
394
|
-
| `range()` |
|
|
404
|
+
| Methode | Beschreibung | Zeitkomplexität | Speicherplatzkomplexität |
|
|
405
|
+
|------|------|------------|------------|
|
|
406
|
+
| `range()` | Bereich | O(n) | O(1) |
|
|
395
407
|
| `variance()` | Varianz | O(n) | O(1) |
|
|
396
408
|
| `standardDeviation()` | Standardabweichung | O(n) | O(1) |
|
|
397
409
|
| `mean()` | Mittelwert | O(n) | O(1) |
|
|
398
410
|
| `median()` | Median | O(n log n) | O(n) |
|
|
399
411
|
| `mode()` | Modus | O(n) | O(n) |
|
|
400
412
|
| `frequency()` | Häufigkeitsverteilung | O(n) | O(n) |
|
|
401
|
-
| `summate()` |
|
|
413
|
+
| `summate()` | Summation | O(n) | O(1) |
|
|
402
414
|
| `quantile(quantile)` | Quantil | O(n log n) | O(n) |
|
|
403
415
|
| `interquartileRange()` | Interquartilsabstand | O(n log n) | O(n) |
|
|
404
416
|
| `skewness()` | Schiefe | O(n) | O(1) |
|
|
@@ -406,7 +418,7 @@ data.join(", "); // "2, 4, 6, 8, 10"
|
|
|
406
418
|
|
|
407
419
|
```typescript
|
|
408
420
|
// Statistische Analysebeispiele
|
|
409
|
-
|
|
421
|
+
let numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
410
422
|
.toNumericStatistics();
|
|
411
423
|
|
|
412
424
|
console.log("Mittelwert:", numbers.mean()); // 5.5
|
|
@@ -414,51 +426,48 @@ console.log("Median:", numbers.median()); // 5.5
|
|
|
414
426
|
console.log("Standardabweichung:", numbers.standardDeviation()); // ~2.87
|
|
415
427
|
console.log("Summe:", numbers.summate()); // 55
|
|
416
428
|
|
|
417
|
-
//
|
|
418
|
-
|
|
429
|
+
// Mit Mappern statistische Analyse durchführen
|
|
430
|
+
let objects = from([
|
|
419
431
|
{ value: 10 },
|
|
420
432
|
{ value: 20 },
|
|
421
433
|
{ value: 30 }
|
|
422
434
|
]).toNumericStatistics();
|
|
423
|
-
|
|
424
435
|
console.log("Gemappter Mittelwert:", objects.mean(obj => obj.value)); // 20
|
|
425
436
|
```
|
|
426
437
|
|
|
427
|
-
##
|
|
438
|
+
## Leistungsauswahlhandbuch
|
|
428
439
|
|
|
429
|
-
###
|
|
440
|
+
### Wählen Sie einen ungeordneten Collector (Leistung zuerst)
|
|
430
441
|
```typescript
|
|
431
|
-
// Wenn keine Reihenfolgegarantie benötigt wird
|
|
432
|
-
|
|
442
|
+
// Wenn keine Reihenfolgegarantie benötigt wird, verwenden Sie einen ungeordneten Collector für beste Leistung
|
|
443
|
+
let highPerformance = data
|
|
433
444
|
.filter(predicate)
|
|
434
445
|
.map(mapper)
|
|
435
|
-
.
|
|
446
|
+
.toUnordered(); // Beste Leistung
|
|
436
447
|
```
|
|
437
448
|
|
|
438
|
-
###
|
|
449
|
+
### Wählen Sie einen geordneten Collector (Reihenfolge erforderlich)
|
|
439
450
|
```typescript
|
|
440
|
-
// Wenn
|
|
441
|
-
|
|
442
|
-
.sorted(comparator) // Sortierung überschreibt Umleitungseffekte
|
|
443
|
-
.toOrdered(); // Beibehaltung der Reihenfolge
|
|
451
|
+
// Wenn die Reihenfolge der Elemente beibehalten werden muss, verwenden Sie einen geordneten Collector
|
|
452
|
+
let ordered = data.sorted(comparator);
|
|
444
453
|
```
|
|
445
454
|
|
|
446
|
-
###
|
|
455
|
+
### Wählen Sie einen Fenstercollector (Fensteroperationen)
|
|
447
456
|
```typescript
|
|
448
|
-
//
|
|
449
|
-
|
|
457
|
+
// Wenn Fensteroperationen benötigt werden
|
|
458
|
+
let window: WindowCollectable<number> = data
|
|
450
459
|
.toWindow()
|
|
451
|
-
.slide(5n, 2n); //
|
|
460
|
+
.slide(5n, 2n); // Gleitender Fenster
|
|
452
461
|
```
|
|
453
462
|
|
|
454
|
-
###
|
|
463
|
+
### Wählen Sie eine statistische Analyse (numerische Berechnungen)
|
|
455
464
|
```typescript
|
|
456
|
-
//
|
|
457
|
-
|
|
458
|
-
.toNumericStatistics(); // Numerische
|
|
465
|
+
// Wenn eine statistische Analyse benötigt wird
|
|
466
|
+
let statistics: NumericStatistics<number> = data
|
|
467
|
+
.toNumericStatistics(); // Numerische Statistiken
|
|
459
468
|
|
|
460
|
-
|
|
461
|
-
.toBigintStatistics(); //
|
|
469
|
+
let bigIntStatistics: BigintStatistics<bigint> = data
|
|
470
|
+
.toBigintStatistics(); // Große Ganzzahlstatistiken
|
|
462
471
|
```
|
|
463
472
|
|
|
464
473
|
[GitHub](https://github.com/eloyhere/semantic-typescript)
|
|
@@ -466,9 +475,9 @@ const bigIntStats = data
|
|
|
466
475
|
|
|
467
476
|
## Wichtige Hinweise
|
|
468
477
|
|
|
469
|
-
1. **Auswirkungen von
|
|
470
|
-
2. **
|
|
471
|
-
3. **
|
|
472
|
-
4. **Echtzeitdaten**: Semantic-Streams eignen sich für Echtzeitdaten und unterstützen asynchrone Datenquellen
|
|
478
|
+
1. **Auswirkungen von Sortiervorgängen**: In geordneten Collectors überschreibt der `sorted()`-Vorgang die Effekte von `redirect`, `translate`, `shuffle`, `reverse`.
|
|
479
|
+
2. **Leistungserwägungen**: Wenn keine Reihenfolgegarantie benötigt wird, bevorzugen Sie die Verwendung von `toUnordered()` für eine bessere Leistung.
|
|
480
|
+
3. **Speicherverwendung**: Sortiervorgänge erfordern zusätzlichen Speicherplatz von O(n).
|
|
481
|
+
4. **Echtzeitdaten**: Semantic-Streams eignen sich für die Verarbeitung von Echtzeitdaten und unterstützen asynchrone Datenquellen.
|
|
473
482
|
|
|
474
|
-
Diese Bibliothek bietet TypeScript-Entwicklern leistungsstarke und flexible
|
|
483
|
+
Diese Bibliothek bietet TypeScript-Entwicklern leistungsstarke und flexible Streaming-Fähigkeiten und kombiniert die Vorteile der funktionalen Programmierung mit Typsicherheitsgarantien.
|