semantic-typescript 0.0.7 → 0.0.8
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/package.json +1 -1
- package/readme.cn.md +441 -247
- package/readme.de.md +434 -240
- package/readme.es.md +434 -240
- package/readme.fr.md +434 -240
- package/readme.jp.md +434 -240
- package/readme.kr.md +441 -247
- package/readme.md +434 -240
- package/readme.ru.md +529 -0
- package/readme.tw.md +441 -247
package/readme.fr.md
CHANGED
|
@@ -1,335 +1,529 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Cadre de Traitement de Flux Semantic-TypeScript
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
Elle fournit des constructions fonctionnelles composites pour travailler avec des collections, des flux et des séquences — avec prise en charge du tri, du filtrage, du regroupement, des statistiques et bien plus encore.
|
|
3
|
+
## Introduction
|
|
5
4
|
|
|
6
|
-
|
|
5
|
+
Semantic-TypeScript est une bibliothèque moderne de traitement de flux inspirée par GeneratorFunction de JavaScript, Java Stream et MySQL Index. La philosophie de conception centrale repose sur la construction de pipelines efficaces de traitement de données grâce à l'indexation des données, offrant une expérience d'opération de flux de type fonctionnel et sécurisée par les types pour le développement frontend.
|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
Contrairement au traitement synchrone traditionnel, Semantic utilise un modèle de traitement asynchrone. Lors de la création de flux de données, le moment de la réception des données terminales dépend entièrement du moment où l'amont appelle les fonctions de rappel `accept` et `interrupt`. Cette conception permet à la bibliothèque de gérer élégamment les flux de données en temps réel, les grands ensembles de données et les sources de données asynchrones.
|
|
9
8
|
|
|
10
|
-
##
|
|
9
|
+
## Caractéristiques Principales
|
|
11
10
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
- ✅ Conception basée sur les **itérateurs et générateurs** — adaptée aux gros volumes ou données asynchrones
|
|
11
|
+
| Caractéristique | Description | Avantage |
|
|
12
|
+
|------|------|------|
|
|
13
|
+
| **Génériques Type-Safe** | Support complet des types TypeScript | Détection d'erreurs à la compilation, meilleure expérience de développement |
|
|
14
|
+
| **Programmation Fonctionnelle** | Structures de données immuables et fonctions pures | Code plus prévisible, tests et maintenance plus faciles |
|
|
15
|
+
| **Évaluation Paresseuse** | Calcul à la demande, optimisation des performances | Haute efficacité mémoire lors du traitement de grands ensembles de données |
|
|
16
|
+
| **Traitement de Flux Asynchrone** | Flux de données asynchrones basés sur les générateurs | Adapté aux données en temps réel et scénarios pilotés par événements |
|
|
17
|
+
| **Collecteurs Multi-Paradigmes** | Stratégies de collecte ordonnées, non ordonnées, statistiques | Sélection de stratégie optimale basée sur différents scénarios |
|
|
18
|
+
| **Analyse Statistique** | Fonctions de calcul statistique complètes intégrées | Génération intégrée d'analyse de données et de rapports |
|
|
21
19
|
|
|
22
|
-
|
|
20
|
+
## Considérations de Performance
|
|
23
21
|
|
|
24
|
-
|
|
22
|
+
**Note Importante**: Les méthodes suivantes sacrifient les performances pour collecter et trier les données, entraînant des collections de données ordonnées:
|
|
23
|
+
- `toOrdered()`
|
|
24
|
+
- `toWindow()`
|
|
25
|
+
- `toNumericStatistics()`
|
|
26
|
+
- `toBigIntStatistics()`
|
|
27
|
+
- `sorted()`
|
|
28
|
+
- `sorted(comparator)`
|
|
25
29
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## 🧠 Concepts clés
|
|
33
|
-
|
|
34
|
-
### 1. `Optional<T>` — Gestion sûre des valeurs nulles
|
|
35
|
-
|
|
36
|
-
Un conteneur monadique pour des valeurs pouvant être `null` ou `undefined`.
|
|
30
|
+
Particulièrement important à noter: `sorted()` et `sorted(comparator)` écraseront les résultats des méthodes suivantes:
|
|
31
|
+
- `redirect(redirector)`
|
|
32
|
+
- `translate(translator)`
|
|
33
|
+
- `shuffle(mapper)`
|
|
37
34
|
|
|
38
|
-
|
|
35
|
+
## Méthodes d'Usine
|
|
39
36
|
|
|
40
|
-
|
|
41
|
-
|--------|-------------|---------|
|
|
42
|
-
| `of(value)` | Envelopper une valeur (peut être nulle) | `Optional.of(null)` |
|
|
43
|
-
| `ofNullable(v)` | Envelopper, autorise les valeurs nulles | `Optional.ofNullable(someVar)` |
|
|
44
|
-
| `ofNonNull(v)` | Envelopper, lève une erreur si null/undefined | `Optional.ofNonNull(5)` |
|
|
45
|
-
| `get()` | Obtenir la valeur (ou lever une exception si vide) | `opt.get()` |
|
|
46
|
-
| `getOrDefault(d)` | Obtenir la valeur ou une valeur par défaut | `opt.getOrDefault(0)` |
|
|
47
|
-
| `ifPresent(fn)` | Exécuter un effet de bord si la valeur existe | `opt.ifPresent(x => console.log(x))` |
|
|
48
|
-
| `map(fn)` | Transformer la valeur si elle existe | `opt.map(x => x + 1)` |
|
|
49
|
-
| `filter(fn)` | Conserver la valeur seulement si le prédicat est vrai | `opt.filter(x => x > 0)` |
|
|
50
|
-
| `isEmpty()` | Vérifie si la valeur est absente | `opt.isEmpty()` |
|
|
51
|
-
| `isPresent()` | Vérifie si une valeur est présente | `opt.isPresent()` |
|
|
37
|
+
### Usines de Création de Flux
|
|
52
38
|
|
|
53
|
-
|
|
39
|
+
| Méthode | Signature | Description | Exemple |
|
|
40
|
+
|------|------|------|------|
|
|
41
|
+
| `blob` | `(blob: Blob, chunk?: bigint) => Semantic<Uint8Array>` | Convertir Blob en flux d'octets | `blob(fileBlob, 1024n)` |
|
|
42
|
+
| `empty` | `<E>() => Semantic<E>` | Créer un flux vide | `empty<number>()` |
|
|
43
|
+
| `fill` | `<E>(element: E, count: bigint) => Semantic<E>` | Remplir avec un nombre spécifié d'éléments | `fill("hello", 5n)` |
|
|
44
|
+
| `from` | `<E>(iterable: Iterable<E>) => Semantic<E>` | Créer un flux à partir d'un objet itérable | `from([1, 2, 3])` |
|
|
45
|
+
| `range` | `<N extends number\|bigint>(start: N, end: N, step?: N) => Semantic<N>` | Créer un flux de plage numérique | `range(1, 10, 2)` |
|
|
46
|
+
| `iterate` | `<E>(generator: Generator<E>) => Semantic<E>` | Créer un flux à partir d'une fonction génératrice | `iterate(myGenerator)` |
|
|
47
|
+
| `websocket` | `(websocket: WebSocket) => Semantic<MessageEvent>` | Créer un flux d'événements à partir de WebSocket | `websocket(socket)` |
|
|
54
48
|
|
|
49
|
+
**Supplément d'Exemple de Code:**
|
|
55
50
|
```typescript
|
|
56
|
-
import {
|
|
51
|
+
import { from, range, fill, empty } from 'semantic-typescript';
|
|
57
52
|
|
|
58
|
-
|
|
53
|
+
// Créer un flux à partir d'un tableau
|
|
54
|
+
const numberStream = from([1, 2, 3, 4, 5]);
|
|
59
55
|
|
|
60
|
-
|
|
56
|
+
// Créer un flux de plage numérique
|
|
57
|
+
const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
61
58
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
.map(v => v * 2)
|
|
65
|
-
.getOrDefault(0);
|
|
59
|
+
// Remplir avec des éléments répétés
|
|
60
|
+
const filledStream = fill("hello", 3n); // "hello", "hello", "hello"
|
|
66
61
|
|
|
67
|
-
|
|
62
|
+
// Créer un flux vide
|
|
63
|
+
const emptyStream = empty<number>();
|
|
68
64
|
```
|
|
69
65
|
|
|
70
|
-
|
|
66
|
+
### Usines de Fonctions Utilitaires
|
|
71
67
|
|
|
72
|
-
|
|
68
|
+
| Méthode | Signature | Description | Exemple |
|
|
69
|
+
|------|------|------|------|
|
|
70
|
+
| `validate` | `<T>(t: MaybeInvalid<T>) => t is T` | Valider si la valeur est valide | `validate(null)` → `false` |
|
|
71
|
+
| `invalidate` | `<T>(t: MaybeInvalid<T>) => t is null\|undefined` | Valider si la valeur est invalide | `invalidate(0)` → `false` |
|
|
72
|
+
| `useCompare` | `<T>(t1: T, t2: T) => number` | Fonction de comparaison générique | `useCompare("a", "b")` → `-1` |
|
|
73
|
+
| `useRandom` | `<T = number\|bigint>(index: T) => T` | Générateur de nombres pseudo-aléatoires | `useRandom(5)` → nombre aléatoire |
|
|
73
74
|
|
|
74
|
-
|
|
75
|
+
**Supplément d'Exemple de Code:**
|
|
76
|
+
```typescript
|
|
77
|
+
import { validate, invalidate, useCompare, useRandom } from 'semantic-typescript';
|
|
75
78
|
|
|
76
|
-
|
|
79
|
+
// Valider la validité des données
|
|
80
|
+
const data: string | null = "hello";
|
|
81
|
+
if (validate(data)) {
|
|
82
|
+
console.log(data.toUpperCase()); // Appel sécurisé car validate garantit que data n'est pas null
|
|
83
|
+
}
|
|
77
84
|
|
|
78
|
-
|
|
85
|
+
const nullData: string | null = null;
|
|
86
|
+
if (invalidate(nullData)) {
|
|
87
|
+
console.log("Données invalides"); // S'exécutera car invalidate a détecté null
|
|
88
|
+
}
|
|
79
89
|
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
| `from(iterable)` | Créer à partir d’un Array, Set, Iterable | `from([1, 2, 3])` |
|
|
83
|
-
| `range(start, end, step?)` | Générer une plage de nombres | `range(0, 5)` → 0,1,2,3,4 |
|
|
84
|
-
| `fill(element, count)` | Répéter un élément N fois | `fill('a', 3n)` |
|
|
85
|
-
| `iterate(gen)` | Utiliser une fonction générateur personnalisée | `iterate(genFn)` |
|
|
90
|
+
// Comparer des valeurs
|
|
91
|
+
const comparison = useCompare("apple", "banana"); // -1
|
|
86
92
|
|
|
87
|
-
|
|
93
|
+
// Générer un nombre aléatoire
|
|
94
|
+
const randomNum = useRandom(42); // Nombre aléatoire basé sur la graine 42
|
|
95
|
+
```
|
|
88
96
|
|
|
89
|
-
|
|
90
|
-
|--------|-------------|---------|
|
|
91
|
-
| `map(fn)` | Transformer chaque élément | `.map(x => x * 2)` |
|
|
92
|
-
| `filter(fn)` | Conserver les éléments répondant au prédicat | `.filter(x => x > 10)` |
|
|
93
|
-
| `limit(n)` | Limiter aux N premiers éléments | `.limit(5)` |
|
|
94
|
-
| `skip(n)` | Ignorer les N premiers éléments | `.skip(2)` |
|
|
95
|
-
| `distinct()` | Supprimer les doublons (utilise Set par défaut) | `.distinct()` |
|
|
96
|
-
| `sorted()` | Trier les éléments (ordre naturel) | `.sorted()` |
|
|
97
|
-
| `sorted(comparator)` | Trier avec un comparateur personnalisé | `.sorted((a, b) => a - b)` |
|
|
98
|
-
| `toOrdered()` | Trier et retourner un `OrderedCollectable` | `.toOrdered()` |
|
|
99
|
-
| `toUnordered()` | **Pas de tri** — le plus rapide | `.toUnordered()` ✅ |
|
|
100
|
-
| `collect(collector)` | Aggréger avec un `Collector` | `.collect(Collector.full(...))` |
|
|
101
|
-
| `toArray()` | Convertir en tableau | `.toArray()` |
|
|
102
|
-
| `toSet()` | Convertir en Set | `.toSet()` |
|
|
103
|
-
| `toMap(keyFn, valFn)` | Convertir en Map | `.toMap(x => x.id, x => x)` |
|
|
97
|
+
## Détails de la Classe Principale
|
|
104
98
|
|
|
105
|
-
|
|
99
|
+
### Optional<T> - Gestion Sécurisée des Valeurs Nulles
|
|
106
100
|
|
|
107
|
-
|
|
101
|
+
La classe Optional fournit une approche fonctionnelle pour gérer en toute sécurité les valeurs pouvant être nulles ou non définies.
|
|
108
102
|
|
|
109
|
-
|
|
103
|
+
| Méthode | Type de Retour | Description | Complexité Temporelle |
|
|
104
|
+
|------|----------|------|------------|
|
|
105
|
+
| `filter(predicate: Predicate<T>)` | `Optional<T>` | Filtrer les valeurs satisfaisant la condition | O(1) |
|
|
106
|
+
| `get()` | `T` | Obtenir la valeur, lance une erreur si vide | O(1) |
|
|
107
|
+
| `getOrDefault(defaultValue: T)` | `T` | Obtenir la valeur ou la valeur par défaut | O(1) |
|
|
108
|
+
| `ifPresent(action: Consumer<T>)` | `void` | Exécuter l'action si la valeur existe | O(1) |
|
|
109
|
+
| `isEmpty()` | `boolean` | Vérifier si vide | O(1) |
|
|
110
|
+
| `isPresent()` | `boolean` | Vérifier si la valeur existe | O(1) |
|
|
111
|
+
| `map<R>(mapper: Functional<T, R>)` | `Optional<R>` | Mapper et transformer la valeur | O(1) |
|
|
112
|
+
| `static of<T>(value: MaybeInvalid<T>)` | `Optional<T>` | Créer une instance Optional | O(1) |
|
|
113
|
+
| `static ofNullable<T>(value?)` | `Optional<T>` | Créer une Optional nullable | O(1) |
|
|
114
|
+
| `static ofNonNull<T>(value: T)` | `Optional<T>` | Créer une Optional non nulle | O(1) |
|
|
110
115
|
|
|
116
|
+
**Supplément d'Exemple de Code:**
|
|
111
117
|
```typescript
|
|
112
|
-
|
|
113
|
-
```
|
|
118
|
+
import { Optional } from 'semantic-typescript';
|
|
114
119
|
|
|
115
|
-
|
|
116
|
-
|
|
120
|
+
// Créer une instance Optional
|
|
121
|
+
const optionalValue = Optional.ofNullable<string>(Math.random() > 0.5 ? "hello" : null);
|
|
117
122
|
|
|
118
|
-
|
|
123
|
+
// Opérations en chaîne
|
|
124
|
+
const result = optionalValue
|
|
125
|
+
.filter(val => val.length > 3) // Filtrer les valeurs plus longues que 3
|
|
126
|
+
.map(val => val.toUpperCase()) // Convertir en majuscules
|
|
127
|
+
.getOrDefault("default"); // Obtenir la valeur ou la valeur par défaut
|
|
119
128
|
|
|
120
|
-
|
|
129
|
+
console.log(result); // "HELLO" ou "default"
|
|
121
130
|
|
|
122
|
-
|
|
131
|
+
// Opérations sécurisées
|
|
132
|
+
optionalValue.ifPresent(val => {
|
|
133
|
+
console.log(`La valeur existe: ${val}`);
|
|
134
|
+
});
|
|
123
135
|
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
136
|
+
// Vérifier le statut
|
|
137
|
+
if (optionalValue.isPresent()) {
|
|
138
|
+
console.log("A une valeur");
|
|
139
|
+
} else if (optionalValue.isEmpty()) {
|
|
140
|
+
console.log("Est vide");
|
|
141
|
+
}
|
|
128
142
|
```
|
|
129
143
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
144
|
+
### Semantic<E> - Flux de Données Paresseux
|
|
145
|
+
|
|
146
|
+
Semantic est la classe principale de traitement de flux, offrant de riches opérateurs de flux.
|
|
147
|
+
|
|
148
|
+
#### Opérations de Transformation de Flux
|
|
149
|
+
|
|
150
|
+
| Méthode | Type de Retour | Description | Impact sur les Performances |
|
|
151
|
+
|------|----------|------|----------|
|
|
152
|
+
| `concat(other: Semantic<E>)` | `Semantic<E>` | Concaténer deux flux | O(n+m) |
|
|
153
|
+
| `distinct()` | `Semantic<E>` | Supprimer les doublons (en utilisant Set) | O(n) |
|
|
154
|
+
| `distinct(comparator)` | `Semantic<E>` | Déduplication avec comparateur personnalisé | O(n²) |
|
|
155
|
+
| `dropWhile(predicate)` | `Semantic<E>` | Supprimer les éléments de début satisfaisant la condition | O(n) |
|
|
156
|
+
| `filter(predicate)` | `Semantic<E>` | Filtrer les éléments | O(n) |
|
|
157
|
+
| `flat(mapper)` | `Semantic<E>` | Aplatir les flux imbriqués | O(n×m) |
|
|
158
|
+
| `flatMap(mapper)` | `Semantic<R>` | Mapper et aplatir | O(n×m) |
|
|
159
|
+
| `limit(n)` | `Semantic<E>` | Limiter le nombre d'éléments | O(n) |
|
|
160
|
+
| `map(mapper)` | `Semantic<R>` | Mapper et transformer les éléments | O(n) |
|
|
161
|
+
| `peek(consumer)` | `Semantic<E>` | Voir les éléments sans modification | O(n) |
|
|
162
|
+
| `redirect(redirector)` | `Semantic<E>` | Rediriger les indices | O(n) |
|
|
163
|
+
| `reverse()` | `Semantic<E>` | Inverser l'ordre du flux | O(n) |
|
|
164
|
+
| `shuffle()` | `Semantic<E>` | Mélanger aléatoirement l'ordre | O(n) |
|
|
165
|
+
| `shuffle(mapper)` | `Semantic<E>` | Logique de mélange personnalisée | O(n) |
|
|
166
|
+
| `skip(n)` | `Semantic<E>` | Sauter les n premiers éléments | O(n) |
|
|
167
|
+
| `sub(start, end)` | `Semantic<E>` | Obtenir un sous-flux | O(n) |
|
|
168
|
+
| `takeWhile(predicate)` | `Semantic<E>` | Obtenir les éléments de début satisfaisant la condition | O(n) |
|
|
169
|
+
| `translate(offset)` | `Semantic<E>` | Traduire les indices | O(n) |
|
|
170
|
+
| `translate(translator)` | `Semantic<E>` | Transformation d'indice personnalisée | O(n) |
|
|
171
|
+
|
|
172
|
+
**Supplément d'Exemple de Code:**
|
|
173
|
+
```typescript
|
|
174
|
+
import { from } from 'semantic-typescript';
|
|
135
175
|
|
|
136
|
-
|
|
176
|
+
const stream = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
|
137
177
|
|
|
138
|
-
|
|
178
|
+
// Exemples d'opérations de transformation de flux
|
|
179
|
+
const processedStream = stream
|
|
180
|
+
.filter(x => x % 2 === 0) // Filtrer les nombres pairs
|
|
181
|
+
.map(x => x * 2) // Multiplier chaque élément par 2
|
|
182
|
+
.distinct() // Supprimer les doublons
|
|
183
|
+
.limit(3) // Limiter aux 3 premiers éléments
|
|
184
|
+
.peek((val, index) => console.log(`Élément ${val} à l'indice ${index}`)); // Voir les éléments
|
|
139
185
|
|
|
140
|
-
|
|
141
|
-
Collector.full(identity, accumulator, finisher)
|
|
142
|
-
Collector.shortable(identity, interruptor, accumulator, finisher)
|
|
186
|
+
// Note: Le flux ne s'est pas encore exécuté, doit être converti en Collectable pour les opérations terminales
|
|
143
187
|
```
|
|
144
188
|
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
---
|
|
189
|
+
#### Opérations Terminales de Flux
|
|
148
190
|
|
|
149
|
-
|
|
191
|
+
| Méthode | Type de Retour | Description | Caractéristiques de Performance |
|
|
192
|
+
|------|----------|------|----------|
|
|
193
|
+
| `toOrdered()` | `OrderedCollectable<E>` | Convertir en collection ordonnée | Opération de tri, performance inférieure |
|
|
194
|
+
| `toUnordered()` | `UnorderedCollectable<E>` | Convertir en collection non ordonnée | Plus rapide, pas de tri |
|
|
195
|
+
| `toWindow()` | `WindowCollectable<E>` | Convertir en collection de fenêtre | Opération de tri, performance inférieure |
|
|
196
|
+
| `toNumericStatistics()` | `Statistics<E, number>` | Analyse statistique numérique | Opération de tri, performance inférieure |
|
|
197
|
+
| `toBigintStatistics()` | `Statistics<E, bigint>` | Analyse statistique en grand entier | Opération de tri, performance inférieure |
|
|
198
|
+
| `sorted()` | `OrderedCollectable<E>` | Tri naturel | Écrase les résultats de redirection |
|
|
199
|
+
| `sorted(comparator)` | `OrderedCollectable<E>` | Tri personnalisé | Écrase les résultats de redirection |
|
|
150
200
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
- `UnorderedCollectable<E>` — Pas de tri, le plus rapide
|
|
155
|
-
- `WindowCollectable<E>` — Fenêtres glissantes
|
|
156
|
-
- `Statistics<E, D>` — Statistiques agrégées
|
|
201
|
+
**Supplément d'Exemple de Code:**
|
|
202
|
+
```typescript
|
|
203
|
+
import { from } from 'semantic-typescript';
|
|
157
204
|
|
|
158
|
-
|
|
205
|
+
const semanticStream = from([5, 2, 8, 1, 9, 3, 7, 4, 6]);
|
|
159
206
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
| `count()` | Compter les éléments | `.count()` |
|
|
163
|
-
| `toArray()` | Convertir en tableau | `.toArray()` |
|
|
164
|
-
| `toSet()` | Convertir en Set | `.toSet()` |
|
|
165
|
-
| `toMap(k, v)` | Convertir en Map | `.toMap(x => x.id, x => x)` |
|
|
166
|
-
| `group(k)` | Regrouper par clé | `.group(x => x.category)` |
|
|
167
|
-
| `findAny()` | Trouver un élément quelconque (Optional) | `.findAny()` |
|
|
168
|
-
| `findFirst()` | Trouver le premier élément (Optional) | `.findFirst()` |
|
|
169
|
-
| `reduce(...)` | Réduction personnalisée | `.reduce((a,b) => a + b, 0)` |
|
|
207
|
+
// Convertir en collection ordonnée (performance inférieure)
|
|
208
|
+
const ordered = semanticStream.toOrdered();
|
|
170
209
|
|
|
171
|
-
|
|
210
|
+
// Convertir en collection non ordonnée (plus rapide)
|
|
211
|
+
const unordered = semanticStream.toUnordered();
|
|
172
212
|
|
|
173
|
-
|
|
213
|
+
// Tri naturel
|
|
214
|
+
const sortedNatural = semanticStream.sorted();
|
|
174
215
|
|
|
175
|
-
|
|
216
|
+
// Tri personnalisé
|
|
217
|
+
const sortedCustom = semanticStream.sorted((a, b) => b - a); // Tri décroissant
|
|
176
218
|
|
|
177
|
-
|
|
219
|
+
// Convertir en objet statistique
|
|
220
|
+
const stats = semanticStream.toNumericStatistics();
|
|
178
221
|
|
|
179
|
-
|
|
180
|
-
const sorted = new OrderedCollectable(stream);
|
|
181
|
-
const customSorted = new OrderedCollectable(stream, (a, b) => b - a);
|
|
222
|
+
// Note: Doit appeler les méthodes ci-dessus via une instance Semantic pour obtenir Collectable avant d'utiliser les méthodes terminales
|
|
182
223
|
```
|
|
183
224
|
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
---
|
|
225
|
+
### Collector<E, A, R> - Collecteur de Données
|
|
187
226
|
|
|
188
|
-
|
|
227
|
+
Les collecteurs sont utilisés pour agréger les données de flux dans des structures spécifiques.
|
|
189
228
|
|
|
190
|
-
|
|
229
|
+
| Méthode | Description | Scénario d'Utilisation |
|
|
230
|
+
|------|------|----------|
|
|
231
|
+
| `collect(generator)` | Exécuter la collecte de données | Opération terminale de flux |
|
|
232
|
+
| `static full(identity, accumulator, finisher)` | Créer un collecteur complet | Nécessite un traitement complet |
|
|
233
|
+
| `static shortable(identity, interruptor, accumulator, finisher)` | Créer un collecteur interruptible | Peut se terminer prématurément |
|
|
191
234
|
|
|
235
|
+
**Supplément d'Exemple de Code:**
|
|
192
236
|
```typescript
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
237
|
+
import { Collector } from 'semantic-typescript';
|
|
238
|
+
|
|
239
|
+
// Créer un collecteur personnalisé
|
|
240
|
+
const sumCollector = Collector.full(
|
|
241
|
+
() => 0, // Valeur initiale
|
|
242
|
+
(acc, value) => acc + value, // Accumulateur
|
|
243
|
+
result => result // Fonction de finition
|
|
244
|
+
);
|
|
245
|
+
|
|
246
|
+
// Utiliser le collecteur (nécessite une conversion de Semantic en Collectable d'abord)
|
|
247
|
+
const numbers = from([1, 2, 3, 4, 5]);
|
|
248
|
+
const sum = numbers.toUnordered().collect(sumCollector); // 15
|
|
196
249
|
```
|
|
197
250
|
|
|
198
|
-
|
|
199
|
-
✅ **Meilleure performance lorsque l’ordre n’a pas d’importance**
|
|
200
|
-
|
|
201
|
-
---
|
|
251
|
+
### Collectable<E> - Classe Abstraite de Données Collectables
|
|
202
252
|
|
|
203
|
-
|
|
253
|
+
Fournit des méthodes riches d'agrégation et de transformation de données. **Note: Doit d'abord obtenir une instance Collectable en appelant sorted(), toOrdered() etc. via une instance Semantic avant d'utiliser les méthodes suivantes.**
|
|
204
254
|
|
|
205
|
-
|
|
255
|
+
#### Opérations de Requête de Données
|
|
206
256
|
|
|
207
|
-
|
|
257
|
+
| Méthode | Type de Retour | Description | Exemple |
|
|
258
|
+
|------|----------|------|------|
|
|
259
|
+
| `anyMatch(predicate)` | `boolean` | Si un élément correspond | `anyMatch(x => x > 0)` |
|
|
260
|
+
| `allMatch(predicate)` | `boolean` | Si tous les éléments correspondent | `allMatch(x => x > 0)` |
|
|
261
|
+
| `count()` | `bigint` | Statistiques de nombre d'éléments | `count()` → `5n` |
|
|
262
|
+
| `isEmpty()` | `boolean` | Si le flux est vide | `isEmpty()` |
|
|
263
|
+
| `findAny()` | `Optional<E>` | Trouver n'importe quel élément | `findAny()` |
|
|
264
|
+
| `findFirst()` | `Optional<E>` | Trouver le premier élément | `findFirst()` |
|
|
265
|
+
| `findLast()` | `Optional<E>` | Trouver le dernier élément | `findLast()` |
|
|
208
266
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
##### Méthodes statistiques courantes :
|
|
267
|
+
**Supplément d'Exemple de Code:**
|
|
268
|
+
```typescript
|
|
269
|
+
import { from } from 'semantic-typescript';
|
|
213
270
|
|
|
214
|
-
|
|
215
|
-
|--------|-------------|---------|
|
|
216
|
-
| `mean()` | Moyenne | `.mean()` |
|
|
217
|
-
| `median()` | Médiane | `.median()` |
|
|
218
|
-
| `mode()` | Mode (valeur la plus fréquente) | `.mode()` |
|
|
219
|
-
| `minimum()` | Minimum | `.minimum()` |
|
|
220
|
-
| `maximum()` | Maximum | `.maximum()` |
|
|
221
|
-
| `range()` | Écart (max - min) | `.range()` |
|
|
222
|
-
| `variance()` | Variance | `.variance()` |
|
|
223
|
-
| `standardDeviation()` | Écart-type | `.standardDeviation()` |
|
|
224
|
-
| `summate()` | Somme | `.summate()` |
|
|
225
|
-
| `quantile(q)` | Valeur au quantile q (0–1) | `.quantile(0.5)` → médiane |
|
|
226
|
-
| `frequency()` | Fréquence sous forme de Map | `.frequency()` |
|
|
271
|
+
const numbers = from([1, 2, 3, 4, 5]);
|
|
227
272
|
|
|
228
|
-
|
|
273
|
+
// Doit convertir en Collectable avant d'utiliser les méthodes terminales
|
|
274
|
+
const collectable = numbers.toUnordered();
|
|
229
275
|
|
|
230
|
-
|
|
276
|
+
// Opérations de requête de données
|
|
277
|
+
const hasEven = collectable.anyMatch(x => x % 2 === 0); // true
|
|
278
|
+
const allPositive = collectable.allMatch(x => x > 0); // true
|
|
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(); // N'importe quel élément
|
|
283
|
+
```
|
|
231
284
|
|
|
285
|
+
#### Opérations d'Aggrégation de Données
|
|
286
|
+
|
|
287
|
+
| Méthode | Type de Retour | Description | Complexité |
|
|
288
|
+
|------|----------|------|--------|
|
|
289
|
+
| `group(classifier)` | `Map<K, E[]>` | Grouper par classifieur | O(n) |
|
|
290
|
+
| `groupBy(keyExtractor, valueExtractor)` | `Map<K, V[]>` | Grouper par extracteurs clé-valeur | O(n) |
|
|
291
|
+
| `join()` | `string` | Joindre en chaîne | O(n) |
|
|
292
|
+
| `join(delimiter)` | `string` | Joindre avec délimiteur | O(n) |
|
|
293
|
+
| `partition(count)` | `E[][]` | Partitionner par compte | O(n) |
|
|
294
|
+
| `partitionBy(classifier)` | `E[][]` | Partitionner par classifieur | O(n) |
|
|
295
|
+
| `reduce(accumulator)` | `Optional<E>` | Opération de réduction | O(n) |
|
|
296
|
+
| `reduce(identity, accumulator)` | `E` | Réduction avec identité | O(n) |
|
|
297
|
+
| `toArray()` | `E[]` | Convertir en tableau | O(n) |
|
|
298
|
+
| `toMap(keyExtractor, valueExtractor)` | `Map<K, V>` | Convertir en Map | O(n) |
|
|
299
|
+
| `toSet()` | `Set<E>` | Convertir en Set | O(n) |
|
|
300
|
+
|
|
301
|
+
**Supplément d'Exemple de Code:**
|
|
232
302
|
```typescript
|
|
233
|
-
import { from
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
//
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
303
|
+
import { from } from 'semantic-typescript';
|
|
304
|
+
|
|
305
|
+
const people = from([
|
|
306
|
+
{ name: "Alice", age: 25, city: "New York" },
|
|
307
|
+
{ name: "Bob", age: 30, city: "London" },
|
|
308
|
+
{ name: "Charlie", age: 25, city: "New York" }
|
|
309
|
+
]);
|
|
310
|
+
|
|
311
|
+
// Doit convertir en Collectable avant d'utiliser les opérations d'agrégation
|
|
312
|
+
const collectable = people.toUnordered();
|
|
313
|
+
|
|
314
|
+
// Opérations de regroupement
|
|
315
|
+
const byCity = collectable.group(person => person.city);
|
|
316
|
+
// Map { "New York" => [{name: "Alice", ...}, {name: "Charlie", ...}], "London" => [{name: "Bob", ...}] }
|
|
317
|
+
|
|
318
|
+
const byAge = collectable.groupBy(
|
|
319
|
+
person => person.age,
|
|
320
|
+
person => person.name
|
|
321
|
+
);
|
|
322
|
+
// Map { 25 => ["Alice", "Charlie"], 30 => ["Bob"] }
|
|
323
|
+
|
|
324
|
+
// Convertir en collections
|
|
325
|
+
const array = collectable.toArray(); // Tableau original
|
|
326
|
+
const set = collectable.toSet(); // Collection Set
|
|
327
|
+
const map = collectable.toMap(
|
|
328
|
+
person => person.name,
|
|
329
|
+
person => person.age
|
|
330
|
+
); // Map { "Alice" => 25, "Bob" => 30, "Charlie" => 25 }
|
|
331
|
+
|
|
332
|
+
// Opérations de réduction
|
|
333
|
+
const totalAge = collectable.reduce(0, (acc, person) => acc + person.age); // 80
|
|
334
|
+
const oldest = collectable.reduce((a, b) => a.age > b.age ? a : b); // Optional.of({name: "Bob", age: 30, ...})
|
|
253
335
|
```
|
|
254
336
|
|
|
255
|
-
|
|
337
|
+
### Implémentations Spécifiques de Collecteurs
|
|
256
338
|
|
|
257
|
-
|
|
339
|
+
#### UnorderedCollectable<E>
|
|
340
|
+
- **Caractéristiques**: Collecteur le plus rapide, pas de tri
|
|
341
|
+
- **Scénarios d'Utilisation**: Ordre non important, performance maximale souhaitée
|
|
342
|
+
- **Méthodes**: Hérite de toutes les méthodes Collectable
|
|
258
343
|
|
|
259
|
-
|
|
344
|
+
#### OrderedCollectable<E>
|
|
345
|
+
- **Caractéristiques**: Garantit l'ordre des éléments, performance inférieure
|
|
346
|
+
- **Scénarios d'Utilisation**: Requiert des résultats triés
|
|
347
|
+
- **Méthodes Spéciales**: Hérite de toutes les méthodes, maintient l'état de tri interne
|
|
260
348
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
| `useCompare(a, b)` | Fonction de comparaison universelle |
|
|
268
|
-
| `useRandom(x)` | Générateur de nombre aléatoire (divertissant) |
|
|
349
|
+
#### WindowCollectable<E>
|
|
350
|
+
- **Caractéristiques**: Prend en charge les opérations de fenêtre glissante
|
|
351
|
+
- **Scénarios d'Utilisation**: Analyse de données de séries temporelles
|
|
352
|
+
- **Méthodes Spéciales**:
|
|
353
|
+
- `slide(size, step)` - Fenêtre glissante
|
|
354
|
+
- `tumble(size)` - Fenêtre tumble
|
|
269
355
|
|
|
270
|
-
|
|
356
|
+
**Supplément d'Exemple de Code:**
|
|
357
|
+
```typescript
|
|
358
|
+
import { from } from 'semantic-typescript';
|
|
271
359
|
|
|
272
|
-
|
|
360
|
+
const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
|
273
361
|
|
|
274
|
-
|
|
362
|
+
// Collecteur non ordonné (plus rapide)
|
|
363
|
+
const unordered = data.toUnordered();
|
|
364
|
+
const unorderedArray = unordered.toArray(); // Peut maintenir l'ordre original [1, 2, 3, ...]
|
|
275
365
|
|
|
276
|
-
|
|
277
|
-
const
|
|
278
|
-
|
|
279
|
-
accept(i, BigInt(i));
|
|
280
|
-
if (i === 5) interrupt(i);
|
|
281
|
-
}
|
|
282
|
-
};
|
|
283
|
-
|
|
284
|
-
const s = new Semantic(gen);
|
|
285
|
-
```
|
|
366
|
+
// Collecteur ordonné
|
|
367
|
+
const ordered = data.toOrdered();
|
|
368
|
+
const orderedArray = ordered.toArray(); // Tri garanti [1, 2, 3, ...]
|
|
286
369
|
|
|
287
|
-
|
|
370
|
+
// Collecteur de fenêtre
|
|
371
|
+
const windowed = data.toWindow();
|
|
372
|
+
const slidingWindows = windowed.slide(3n, 2n); // Taille de fenêtre 3, pas 2
|
|
373
|
+
// Fenêtre 1: [1, 2, 3], Fenêtre 2: [3, 4, 5], Fenêtre 3: [5, 6, 7], ...
|
|
288
374
|
|
|
289
|
-
|
|
290
|
-
|
|
375
|
+
const tumblingWindows = windowed.tumble(4n); // Taille de fenêtre tumble 4
|
|
376
|
+
// Fenêtre 1: [1, 2, 3, 4], Fenêtre 2: [5, 6, 7, 8], ...
|
|
291
377
|
```
|
|
292
378
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
379
|
+
### Statistics<E, D> - Analyse Statistique
|
|
380
|
+
|
|
381
|
+
Classe de base d'analyse statistique fournissant de riches méthodes de calcul statistique. **Note: Doit d'abord obtenir une instance Statistics en appelant toNumericStatistics() ou toBigIntStatistics() via une instance Semantic avant d'utiliser les méthodes suivantes.**
|
|
382
|
+
|
|
383
|
+
#### Opérations de Calcul Statistique
|
|
384
|
+
|
|
385
|
+
| Méthode | Type de Retour | Description | Complexité de l'Algorithme |
|
|
386
|
+
|------|----------|------|------------|
|
|
387
|
+
| `maximum()` | `Optional<E>` | Valeur maximale | O(n) |
|
|
388
|
+
| `minimum()` | `Optional<E>` | Valeur minimale | O(n) |
|
|
389
|
+
| `range()` | `D` | Plage (max-min) | O(n) |
|
|
390
|
+
| `variance()` | `D` | Variance | O(n) |
|
|
391
|
+
| `standardDeviation()` | `D` | Écart type | O(n) |
|
|
392
|
+
| `mean()` | `D` | Valeur moyenne | O(n) |
|
|
393
|
+
| `median()` | `D` | Valeur médiane | O(n log n) |
|
|
394
|
+
| `mode()` | `D` | Valeur modale | O(n) |
|
|
395
|
+
| `frequency()` | `Map<D, bigint>` | Distribution de fréquence | O(n) |
|
|
396
|
+
| `summate()` | `D` | Sommation | O(n) |
|
|
397
|
+
| `quantile(quantile)` | `D` | Quantile | O(n log n) |
|
|
398
|
+
| `interquartileRange()` | `D` | Intervalle interquartile | O(n log n) |
|
|
399
|
+
| `skewness()` | `D` | Asymétrie | O(n) |
|
|
400
|
+
| `kurtosis()` | `D` | Aplatissement | O(n) |
|
|
401
|
+
|
|
402
|
+
**Supplément d'Exemple de Code:**
|
|
403
|
+
```typescript
|
|
404
|
+
import { from } from 'semantic-typescript';
|
|
405
|
+
|
|
406
|
+
const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
|
407
|
+
|
|
408
|
+
// Doit convertir en objet statistique avant d'utiliser les méthodes statistiques
|
|
409
|
+
const stats = numbers.toNumericStatistics();
|
|
410
|
+
|
|
411
|
+
// Statistiques de base
|
|
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
|
+
// Statistiques avancées
|
|
421
|
+
const variance = stats.variance(); // 8.25
|
|
422
|
+
const stdDev = stats.standardDeviation(); // 2.872
|
|
423
|
+
const mode = stats.mode(); // N'importe quelle valeur (puisque toutes apparaissent une fois)
|
|
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
|
+
// Distribution de fréquence
|
|
429
|
+
const freq = stats.frequency(); // Map {1 => 1n, 2 => 1n, ...}
|
|
430
|
+
```
|
|
298
431
|
|
|
299
|
-
|
|
432
|
+
#### Classes d'Implémentation Statistique Spécifiques
|
|
300
433
|
|
|
301
|
-
|
|
434
|
+
**NumericStatistics<E>**
|
|
435
|
+
- Gère l'analyse statistique de type nombre
|
|
436
|
+
- Tous les calculs statistiques retournent le type nombre
|
|
302
437
|
|
|
303
|
-
|
|
438
|
+
**BigIntStatistics<E>**
|
|
439
|
+
- Gère l'analyse statistique de type bigint
|
|
440
|
+
- Tous les calculs statistiques retournent le type bigint
|
|
304
441
|
|
|
305
|
-
|
|
442
|
+
**Supplément d'Exemple de Code:**
|
|
443
|
+
```typescript
|
|
444
|
+
import { from } from 'semantic-typescript';
|
|
306
445
|
|
|
307
|
-
|
|
446
|
+
// Statistiques numériques
|
|
447
|
+
const numberData = from([10, 20, 30, 40, 50]);
|
|
448
|
+
const numericStats = numberData.toNumericStatistics();
|
|
308
449
|
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
| Gérer les valeurs nulles | `Optional<T>` |
|
|
312
|
-
| Créer un flux | `from([...])`, `range()`, `fill()` |
|
|
313
|
-
| Transformer des données | `map()`, `filter()` |
|
|
314
|
-
| Trier des données | `sorted()`, `toOrdered()` |
|
|
315
|
-
| Pas de tri (le plus rapide) | `toUnordered()` ✅ |
|
|
316
|
-
| Regrouper / Aggréger | `toMap()`, `group()`, `Collector` |
|
|
317
|
-
| Statistiques | `NumericStatistics`, `mean()`, `median()`, etc. |
|
|
450
|
+
console.log(numericStats.mean()); // 30
|
|
451
|
+
console.log(numericStats.summate()); // 150
|
|
318
452
|
|
|
319
|
-
|
|
453
|
+
// Statistiques en grand entier
|
|
454
|
+
const bigintData = from([100n, 200n, 300n, 400n, 500n]);
|
|
455
|
+
const bigintStats = bigintData.toBigIntStatistics();
|
|
320
456
|
|
|
321
|
-
|
|
457
|
+
console.log(bigintStats.mean()); // 300n
|
|
458
|
+
console.log(bigintStats.summate()); // 1500n
|
|
322
459
|
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
460
|
+
// Statistiques utilisant des fonctions de mappage
|
|
461
|
+
const objectData = from([
|
|
462
|
+
{ value: 15 },
|
|
463
|
+
{ value: 25 },
|
|
464
|
+
{ value: 35 },
|
|
465
|
+
{ value: 45 }
|
|
466
|
+
]);
|
|
326
467
|
|
|
327
|
-
|
|
468
|
+
const objectStats = objectData.toNumericStatistics();
|
|
469
|
+
const meanWithMapper = objectStats.mean(obj => obj.value); // 30
|
|
470
|
+
const sumWithMapper = objectStats.summate(obj => obj.value); // 120
|
|
471
|
+
```
|
|
328
472
|
|
|
329
|
-
|
|
473
|
+
## Exemple Complet d'Utilisation
|
|
330
474
|
|
|
331
|
-
|
|
475
|
+
```typescript
|
|
476
|
+
import { from, validate, invalidate } from 'semantic-typescript';
|
|
477
|
+
|
|
478
|
+
// 1. Créer un flux de données
|
|
479
|
+
const rawData = [5, 2, 8, 1, null, 9, 3, undefined, 7, 4, 6];
|
|
480
|
+
const semanticStream = from(rawData);
|
|
481
|
+
|
|
482
|
+
// 2. Pipeline de traitement de flux
|
|
483
|
+
const processedStream = semanticStream
|
|
484
|
+
.filter(val => validate(val)) // Filtrer les null et undefined
|
|
485
|
+
.map(val => val! * 2) // Multiplier chaque valeur par 2 (en utilisant ! car validate garantit non vide)
|
|
486
|
+
.distinct(); // Supprimer les doublons
|
|
487
|
+
|
|
488
|
+
// 3. Convertir en Collectable et utiliser les opérations terminales
|
|
489
|
+
const collectable = processedStream.toUnordered();
|
|
490
|
+
|
|
491
|
+
// 4. Validation et utilisation des données
|
|
492
|
+
if (!collectable.isEmpty()) {
|
|
493
|
+
const results = collectable
|
|
494
|
+
.filter(x => x > 5) // Filtrer à nouveau
|
|
495
|
+
.toArray(); // Convertir en tableau
|
|
496
|
+
|
|
497
|
+
console.log("Résultats du traitement:", results); // [16, 18, 14, 8, 12]
|
|
498
|
+
|
|
499
|
+
// Informations statistiques
|
|
500
|
+
const stats = processedStream.toNumericStatistics();
|
|
501
|
+
console.log("Valeur moyenne:", stats.mean()); // 11.2
|
|
502
|
+
console.log("Somme totale:", stats.summate()); // 56
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
// 5. Gérer les données potentiellement invalides
|
|
506
|
+
const potentiallyInvalidData: Array<number | null> = [1, null, 3, 4, null];
|
|
507
|
+
const validData = potentiallyInvalidData.filter(validate);
|
|
508
|
+
const invalidData = potentiallyInvalidData.filter(invalidate);
|
|
509
|
+
|
|
510
|
+
console.log("Données valides:", validData); // [1, 3, 4]
|
|
511
|
+
console.log("Données invalides:", invalidData); // [null, null]
|
|
512
|
+
```
|
|
332
513
|
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
514
|
+
## Règles d'Utilisation Importantes Résumées
|
|
515
|
+
|
|
516
|
+
1. **Créer un Flux**: Utiliser les méthodes d'usine `from()`, `range()`, `fill()` etc. pour créer des instances Semantic
|
|
517
|
+
2. **Transformation de Flux**: Appeler les méthodes `map()`, `filter()`, `distinct()` etc. sur les instances Semantic
|
|
518
|
+
3. **Convertir en Collectable**: Doit appeler l'une des méthodes suivantes via une instance Semantic:
|
|
519
|
+
- `toOrdered()` - Collecteur ordonné
|
|
520
|
+
- `toUnordered()` - Collecteur non ordonné (plus rapide)
|
|
521
|
+
- `toWindow()` - Collecteur de fenêtre
|
|
522
|
+
- `toNumericStatistics()` - Statistiques numériques
|
|
523
|
+
- `toBigIntStatistics()` - Statistiques en grand entier
|
|
524
|
+
- `sorted()` - Tri naturel
|
|
525
|
+
- `sorted(comparator)` - Tri personnalisé
|
|
526
|
+
4. **Opérations Terminales**: Appeler les méthodes terminales `toArray()`, `count()`, `summate()` etc. sur les instances Collectable
|
|
527
|
+
5. **Validation des Données**: Utiliser `validate()` pour garantir que les données ne sont pas nulles/non définies, utiliser `invalidate()` pour vérifier les données invalides
|
|
528
|
+
|
|
529
|
+
Cette conception garantit la sécurité des types et l'optimisation des performances tout en fournissant une fonctionnalité riche de traitement de flux.
|