semantic-typescript 0.2.6 → 0.2.7
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/index.d.ts +5 -5
- package/dist/index.js +5 -5
- package/dist/semantic.d.ts +1 -1
- package/dist/semantic.js +1 -1
- package/dist/utility.d.ts +1 -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.cn.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# Semantic-TypeScript
|
|
1
|
+
# Semantic-TypeScript 流式处理库
|
|
2
2
|
|
|
3
3
|
## 简介
|
|
4
4
|
|
|
5
|
-
Semantic-TypeScript
|
|
5
|
+
Semantic-TypeScript 是一个受 JavaScript GeneratorFunction、Java Stream 和 MySQL 索引启发的现代流式处理库。其核心理念是基于数据索引构建高效的数据处理管道,为前端开发提供类型安全、函数式风格的流式操作体验。
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
与传统同步处理不同,Semantic 采用异步处理模型。在创建数据流时,终端接收到数据的时间完全取决于上游何时调用 `accept` 与 `interrupt` 回调函数。这种设计使该库能够优雅地处理实时数据流、大数据集以及异步数据源。
|
|
8
8
|
|
|
9
9
|
## 安装
|
|
10
10
|
|
|
@@ -16,28 +16,28 @@ npm install semantic-typescript
|
|
|
16
16
|
|
|
17
17
|
| 类型 | 描述 |
|
|
18
18
|
|------|------|
|
|
19
|
-
| `Invalid<T>` |
|
|
20
|
-
| `Valid<T>` | 排除 null 和 undefined 的类型 |
|
|
21
|
-
| `MaybeInvalid<T>` | 可能为 null 或 undefined 的类型 |
|
|
22
|
-
| `Primitive` |
|
|
23
|
-
| `MaybePrimitive<T>` |
|
|
24
|
-
| `OptionalSymbol` | Optional
|
|
25
|
-
| `SemanticSymbol` | Semantic
|
|
26
|
-
| `CollectorsSymbol` | Collector
|
|
27
|
-
| `CollectableSymbol` | Collectable
|
|
28
|
-
| `OrderedCollectableSymbol` | OrderedCollectable
|
|
29
|
-
| `WindowCollectableSymbol` | WindowCollectable
|
|
30
|
-
| `StatisticsSymbol` | Statistics
|
|
31
|
-
| `NumericStatisticsSymbol` | NumericStatistics
|
|
32
|
-
| `BigIntStatisticsSymbol` | BigIntStatistics
|
|
33
|
-
| `UnorderedCollectableSymbol` | UnorderedCollectable
|
|
19
|
+
| `Invalid<T>` | 扩展自 `null` 或 `undefined` 的类型 |
|
|
20
|
+
| `Valid<T>` | 排除 `null` 和 `undefined` 的类型 |
|
|
21
|
+
| `MaybeInvalid<T>` | 可能为 `null` 或 `undefined` 的类型 |
|
|
22
|
+
| `Primitive` | 原始类型的集合 |
|
|
23
|
+
| `MaybePrimitive<T>` | 可能是原始类型的类型 |
|
|
24
|
+
| `OptionalSymbol` | `Optional` 类的 Symbol 标识符 |
|
|
25
|
+
| `SemanticSymbol` | `Semantic` 类的 Symbol 标识符 |
|
|
26
|
+
| `CollectorsSymbol` | `Collector` 类的 Symbol 标识符 |
|
|
27
|
+
| `CollectableSymbol` | `Collectable` 类的 Symbol 标识符 |
|
|
28
|
+
| `OrderedCollectableSymbol` | `OrderedCollectable` 类的 Symbol 标识符 |
|
|
29
|
+
| `WindowCollectableSymbol` | `WindowCollectable` 类的 Symbol 标识符 |
|
|
30
|
+
| `StatisticsSymbol` | `Statistics` 类的 Symbol 标识符 |
|
|
31
|
+
| `NumericStatisticsSymbol` | `NumericStatistics` 类的 Symbol 标识符 |
|
|
32
|
+
| `BigIntStatisticsSymbol` | `BigIntStatistics` 类的 Symbol 标识符 |
|
|
33
|
+
| `UnorderedCollectableSymbol` | `UnorderedCollectable` 类的 Symbol 标识符 |
|
|
34
34
|
|
|
35
35
|
## 函数式接口
|
|
36
36
|
|
|
37
37
|
| 接口 | 描述 |
|
|
38
38
|
|------|------|
|
|
39
|
-
| `Runnable` |
|
|
40
|
-
| `Supplier<R>` |
|
|
39
|
+
| `Runnable` | 无参数且无返回值的函数 |
|
|
40
|
+
| `Supplier<R>` | 无参数并返回 `R` 的函数 |
|
|
41
41
|
| `Functional<T, R>` | 单参数转换函数 |
|
|
42
42
|
| `BiFunctional<T, U, R>` | 双参数转换函数 |
|
|
43
43
|
| `TriFunctional<T, U, V, R>` | 三参数转换函数 |
|
|
@@ -48,21 +48,21 @@ npm install semantic-typescript
|
|
|
48
48
|
| `BiConsumer<T, U>` | 双参数消费函数 |
|
|
49
49
|
| `TriConsumer<T, U, V>` | 三参数消费函数 |
|
|
50
50
|
| `Comparator<T>` | 双参数比较函数 |
|
|
51
|
-
| `Generator<T>` |
|
|
51
|
+
| `Generator<T>` | 生成器函数(核心与基础) |
|
|
52
52
|
|
|
53
53
|
```typescript
|
|
54
54
|
// 类型使用示例
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
60
|
## 类型守卫
|
|
61
61
|
|
|
62
62
|
| 函数 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
63
63
|
|------|------|------------|------------|
|
|
64
|
-
| `validate<T>(t: MaybeInvalid<T>): t is T` |
|
|
65
|
-
| `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` |
|
|
64
|
+
| `validate<T>(t: MaybeInvalid<T>): t is T` | 验证值不是 null 或 undefined | O(1) | O(1) |
|
|
65
|
+
| `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | 验证值是 null 或 undefined | O(1) | O(1) |
|
|
66
66
|
| `isBoolean(t: unknown): t is boolean` | 检查是否为布尔值 | O(1) | O(1) |
|
|
67
67
|
| `isString(t: unknown): t is string` | 检查是否为字符串 | O(1) | O(1) |
|
|
68
68
|
| `isNumber(t: unknown): t is number` | 检查是否为数字 | O(1) | O(1) |
|
|
@@ -82,17 +82,26 @@ const comparator: Comparator<number> = (a, b) => a - b;
|
|
|
82
82
|
| `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | 检查是否为 Statistics 实例 | O(1) | O(1) |
|
|
83
83
|
| `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | 检查是否为 NumericStatistics 实例 | O(1) | O(1) |
|
|
84
84
|
| `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | 检查是否为 BigIntStatistics 实例 | O(1) | O(1) |
|
|
85
|
+
| `isPromise(t: unknown): t is Promise<unknown>` | 检查是否为 Promise 对象 | O(1) | O(1) |
|
|
86
|
+
| `isAsync(t: unknown): t is AsyncFunction` | 检查是否为 AsyncFunction | O(1) | O(1) |
|
|
85
87
|
|
|
86
88
|
```typescript
|
|
87
89
|
// 类型守卫使用示例
|
|
88
|
-
|
|
90
|
+
let value: unknown = "hello";
|
|
89
91
|
|
|
90
92
|
if (isString(value)) {
|
|
91
93
|
console.log(value.length); // 类型安全,value 被推断为 string
|
|
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
|
+
// 类型安全,现在它是可迭代对象
|
|
102
|
+
for(let item of value){
|
|
103
|
+
console.log(item);
|
|
104
|
+
}
|
|
96
105
|
}
|
|
97
106
|
```
|
|
98
107
|
|
|
@@ -100,16 +109,15 @@ if (isOptional(someValue)) {
|
|
|
100
109
|
|
|
101
110
|
| 函数 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
102
111
|
|------|------|------------|------------|
|
|
103
|
-
| `useCompare<T>(t1: T, t2: T): number` |
|
|
112
|
+
| `useCompare<T>(t1: T, t2: T): number` | 泛型比较函数 | O(1) | O(1) |
|
|
104
113
|
| `useRandom<T = number \| bigint>(index: T): T` | 伪随机数生成器 | O(log n) | O(1) |
|
|
105
114
|
|
|
106
115
|
```typescript
|
|
107
116
|
// 工具函数使用示例
|
|
108
|
-
|
|
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 随机数
|
|
120
|
+
let randomNum = useRandom(42); // 基于种子的随机数
|
|
113
121
|
```
|
|
114
122
|
|
|
115
123
|
## 工厂方法
|
|
@@ -118,20 +126,20 @@ const randomBigInt = useRandom(1000n); // BigInt 随机数
|
|
|
118
126
|
|
|
119
127
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
120
128
|
|------|------|------------|------------|
|
|
121
|
-
| `Optional.empty<T>()` |
|
|
129
|
+
| `Optional.empty<T>()` | 创建一个空的 Optional | O(1) | O(1) |
|
|
122
130
|
| `Optional.of<T>(value)` | 创建包含值的 Optional | O(1) | O(1) |
|
|
123
131
|
| `Optional.ofNullable<T>(value)` | 创建可能为空的 Optional | O(1) | O(1) |
|
|
124
132
|
| `Optional.ofNonNull<T>(value)` | 创建非空的 Optional | O(1) | O(1) |
|
|
125
133
|
|
|
126
134
|
```typescript
|
|
127
135
|
// Optional 使用示例
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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");
|
|
132
140
|
|
|
133
|
-
|
|
134
|
-
console.log(
|
|
141
|
+
present.ifPresent((value: number): void => console.log(value)); // 输出 42
|
|
142
|
+
console.log(empty.get(100)); // 输出 100
|
|
135
143
|
```
|
|
136
144
|
|
|
137
145
|
### Collector 工厂方法
|
|
@@ -142,31 +150,32 @@ console.log(emptyOpt.orElse(100)); // 输出 100
|
|
|
142
150
|
| `Collector.shortable(identity, interruptor, accumulator, finisher)` | 创建可中断收集器 | O(1) | O(1) |
|
|
143
151
|
|
|
144
152
|
```typescript
|
|
145
|
-
//
|
|
146
|
-
|
|
153
|
+
// Collector 转换示例
|
|
154
|
+
let numbers: Semantic<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
|
|
147
155
|
|
|
148
|
-
//
|
|
149
|
-
|
|
150
|
-
.filter(n => n > 3)
|
|
156
|
+
// 优先性能:使用无序收集器
|
|
157
|
+
let unordered: UnorderedCollectable<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5])
|
|
158
|
+
.filter((n: number): boolean => n > 3)
|
|
151
159
|
.toUnoredered();
|
|
152
160
|
|
|
153
161
|
// 需要排序:使用有序收集器
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
(
|
|
160
|
-
(accumulator) => accumulator //
|
|
162
|
+
let ordered: OrderedCollectable<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5])
|
|
163
|
+
.sorted();
|
|
164
|
+
|
|
165
|
+
// 统计元素数量
|
|
166
|
+
let count: Collector<number, number, number> = Collector.full(
|
|
167
|
+
(): number => 0, // 初始值
|
|
168
|
+
(accumulator: number, element: number): number => accumulator + element, // 累加
|
|
169
|
+
(accumulator: number): number => accumulator // 完成
|
|
161
170
|
);
|
|
162
171
|
count.collect(from([1,2,3,4,5])); // 从流中计数
|
|
163
|
-
count.collect([1,2,3,4,5]); //
|
|
172
|
+
count.collect([1,2,3,4,5]); // 从可迭代对象计数
|
|
164
173
|
|
|
165
|
-
let find = Collector.shortable(
|
|
166
|
-
() => Optional.empty(), // 初始值
|
|
167
|
-
(element, index, accumulator) => accumulator.isPresent(), // 中断
|
|
168
|
-
(accumulator
|
|
169
|
-
(accumulator) => accumulator // 完成
|
|
174
|
+
let find: Optional<number> = Collector.shortable(
|
|
175
|
+
(): Optional<number> => Optional.empty(), // 初始值
|
|
176
|
+
(element: number, index: bigint, accumulator: Optional<number>): Optional<number> => accumulator.isPresent(), // 中断
|
|
177
|
+
(accumulator: Optional<number>, element: number, index: bigint): Optional<number> => Optional.of(element), // 累加
|
|
178
|
+
(accumulator: Optional<number>): Optional<number> => accumulator // 完成
|
|
170
179
|
);
|
|
171
180
|
find.collect(from([1,2,3,4,5])); // 查找第一个元素
|
|
172
181
|
find.collect([1,2,3,4,5]); // 查找第一个元素
|
|
@@ -176,50 +185,58 @@ find.collect([1,2,3,4,5]); // 查找第一个元素
|
|
|
176
185
|
|
|
177
186
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
178
187
|
|------|------|------------|------------|
|
|
188
|
+
| `animationFrame(period: number, delay: number = 0)` | 创建定时动画帧流 | O(1)* | O(1) |
|
|
179
189
|
| `blob(blob, chunkSize)` | 从 Blob 创建流 | O(n) | O(chunkSize) |
|
|
180
190
|
| `empty<E>()` | 创建空流 | O(1) | O(1) |
|
|
181
191
|
| `fill<E>(element, count)` | 创建填充流 | O(n) | O(1) |
|
|
182
192
|
| `from<E>(iterable)` | 从可迭代对象创建流 | O(1) | O(1) |
|
|
183
|
-
| `generate<E>(element, interrupt)` | 创建生成器流 | O(1) | O(1) |
|
|
184
193
|
| `interval(period, delay?)` | 创建定时间隔流 | O(1)* | O(1) |
|
|
185
194
|
| `iterate<E>(generator)` | 从生成器创建流 | O(1) | O(1) |
|
|
186
195
|
| `range(start, end, step)` | 创建数值范围流 | O(n) | O(1) |
|
|
187
196
|
| `websocket(websocket)` | 从 WebSocket 创建流 | O(1) | O(1) |
|
|
188
197
|
|
|
189
198
|
```typescript
|
|
190
|
-
//
|
|
199
|
+
// Semantic 工厂方法使用示例
|
|
200
|
+
|
|
201
|
+
// 从定时动画帧创建流
|
|
202
|
+
animationFrame(1000)
|
|
203
|
+
.toUnordered()
|
|
204
|
+
.forEach(frame => console.log(frame));
|
|
191
205
|
|
|
192
206
|
// 从 Blob 创建流(分块读取)
|
|
193
207
|
blob(someBlob, 1024n)
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
208
|
+
.toUnordered()
|
|
209
|
+
.write(WritableStream)
|
|
210
|
+
.then(callback) // 写入流成功
|
|
211
|
+
.catch(callback); // 写入流失败
|
|
198
212
|
|
|
199
|
-
//
|
|
213
|
+
// 创建空流,需与其他流连接后才会执行
|
|
200
214
|
empty<string>()
|
|
201
|
-
|
|
202
|
-
|
|
215
|
+
.toUnordered()
|
|
216
|
+
.join(); //[]
|
|
203
217
|
|
|
204
218
|
// 创建填充流
|
|
205
|
-
|
|
219
|
+
let filledStream = fill("hello", 3); // "hello", "hello", "hello"
|
|
206
220
|
|
|
207
|
-
//
|
|
208
|
-
|
|
221
|
+
// 创建初始延迟 2 秒、执行周期 5 秒的定时流,基于定时器机制实现;可能因系统调度精度限制产生时间漂移。
|
|
222
|
+
let intervalStream = interval(5000, 2000);
|
|
209
223
|
|
|
210
224
|
// 从可迭代对象创建流
|
|
211
|
-
|
|
212
|
-
|
|
225
|
+
let numberStream = from([1, 2, 3, 4, 5]);
|
|
226
|
+
let stringStream = from(new Set(["Alex", "Bob"]));
|
|
227
|
+
|
|
228
|
+
// 从已解析的 Promise 创建流
|
|
229
|
+
let promisedStream: Semantic<Array<number>> = Promise.resolve([1, 2, 3, 4, 5]);
|
|
213
230
|
|
|
214
231
|
// 创建范围流
|
|
215
|
-
|
|
232
|
+
let rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
216
233
|
|
|
217
234
|
// WebSocket 事件流
|
|
218
|
-
|
|
235
|
+
let ws = new WebSocket("ws://localhost:8080");
|
|
219
236
|
websocket(ws)
|
|
220
|
-
.filter((event)=> event.type === "message"); //
|
|
237
|
+
.filter((event): boolean => event.type === "message"); // 仅监听消息事件
|
|
221
238
|
.toUnordered() // 事件通常无序
|
|
222
|
-
.forEach((event)=> receive(event)); // 接收消息
|
|
239
|
+
.forEach((event): void => receive(event)); // 接收消息
|
|
223
240
|
```
|
|
224
241
|
|
|
225
242
|
## Semantic 类方法
|
|
@@ -240,36 +257,36 @@ websocket(ws)
|
|
|
240
257
|
| `reverse()` | 反转流 | O(n) | O(1) |
|
|
241
258
|
| `shuffle()` | 随机打乱 | O(n) | O(1) |
|
|
242
259
|
| `shuffle(mapper)` | 使用映射器打乱 | O(n) | O(1) |
|
|
243
|
-
| `skip(n)` | 跳过前n个元素 | O(n) | O(1) |
|
|
260
|
+
| `skip(n)` | 跳过前 n 个元素 | O(n) | O(1) |
|
|
244
261
|
| `sorted()` | 排序 | O(n log n) | O(n) |
|
|
245
262
|
| `sorted(comparator)` | 使用比较器排序 | O(n log n) | O(n) |
|
|
246
263
|
| `sub(start, end)` | 获取子流 | O(n) | O(1) |
|
|
247
264
|
| `takeWhile(predicate)` | 获取满足条件的元素 | O(n) | O(1) |
|
|
248
265
|
| `translate(offset)` | 平移索引 | O(n) | O(1) |
|
|
249
|
-
| `translate(translator)` |
|
|
266
|
+
| `translate(translator)` | 使用翻译器平移索引 | O(n) | O(1) |
|
|
250
267
|
|
|
251
268
|
```typescript
|
|
252
269
|
// Semantic 操作示例
|
|
253
|
-
|
|
254
|
-
.filter(n => n % 2 === 0) // 过滤偶数
|
|
255
|
-
.map(n => n * 2) // 乘以2
|
|
270
|
+
let result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
271
|
+
.filter((n: number): boolean => n % 2 === 0) // 过滤偶数
|
|
272
|
+
.map((n: number): number => n * 2) // 乘以 2
|
|
256
273
|
.skip(1) // 跳过第一个
|
|
257
|
-
.limit(3) //
|
|
258
|
-
.
|
|
274
|
+
.limit(3) // 限制为 3 个元素
|
|
275
|
+
.toUnordered() // 转换为无序收集器
|
|
259
276
|
.toArray(); // 转换为数组
|
|
260
277
|
// 结果: [8, 12, 20]
|
|
261
278
|
|
|
262
279
|
// 复杂操作示例
|
|
263
|
-
|
|
264
|
-
.flatMap(n => from([n, n * 2])) // 每个元素映射为两个
|
|
280
|
+
let complexResult = range(1, 100, 1)
|
|
281
|
+
.flatMap((n: number): Semantics<number> => from([n, n * 2])) // 每个元素映射为两个
|
|
265
282
|
.distinct() // 去重
|
|
266
283
|
.shuffle() // 打乱顺序
|
|
267
|
-
.takeWhile(n => n < 50) // 取小于50的元素
|
|
284
|
+
.takeWhile((n: number): boolean => n < 50) // 取小于 50 的元素
|
|
268
285
|
.toOrdered() // 转换为有序收集器
|
|
269
286
|
.toArray(); // 转换为数组
|
|
270
287
|
```
|
|
271
288
|
|
|
272
|
-
## Semantic转换方法
|
|
289
|
+
## Semantic 转换方法
|
|
273
290
|
|
|
274
291
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
275
292
|
|------------|------------|------------|------------|
|
|
@@ -277,44 +294,44 @@ const complexResult = range(1, 100, 1)
|
|
|
277
294
|
| `toUnordered()` | 转换为无序收集器 | O(1) | O(1) |
|
|
278
295
|
| `toOrdered()` | 转换为有序收集器 | O(1) | O(1) |
|
|
279
296
|
| `toNumericStatistics()` | 转换为数值统计 | O(n) | O(1) |
|
|
280
|
-
| `toBigintStatistics()` | 转换为
|
|
297
|
+
| `toBigintStatistics()` | 转换为 BigInt 统计 | O(n) | O(1) |
|
|
281
298
|
| `toWindow()` | 转换为窗口收集器 | O(1) | O(1) |
|
|
282
|
-
| `toCollectable()` | 转换为 `
|
|
299
|
+
| `toCollectable()` | 转换为 `UnorderdCollectable` | O(n) | O(1) |
|
|
283
300
|
| `toCollectable(mapper)` | 转换为自定义收集器 | O(n) | O(1) |
|
|
284
301
|
|
|
285
302
|
```typescript
|
|
286
303
|
// 转换为升序数组
|
|
287
304
|
from([6,4,3,5,2]) // 创建流
|
|
288
|
-
.sorted() //
|
|
305
|
+
.sorted() // 按升序排序
|
|
289
306
|
.toArray(); // [2, 3, 4, 5, 6]
|
|
290
307
|
|
|
291
308
|
// 转换为降序数组
|
|
292
309
|
from([6,4,3,5,2]) // 创建流
|
|
293
|
-
.soted((a, b) => b - a) //
|
|
310
|
+
.soted((a: number, b: number): number => b - a) // 按降序排序
|
|
294
311
|
.toArray(); // [6, 5, 4, 3, 2]
|
|
295
312
|
|
|
296
|
-
//
|
|
313
|
+
// 重定向为倒序数组
|
|
297
314
|
from([6,4,3,5,2])
|
|
298
|
-
.redirect((element, index) => -index) //
|
|
299
|
-
.toOrderd() //
|
|
315
|
+
.redirect((element, index): bigint => -index) // 重定向为倒序
|
|
316
|
+
.toOrderd() // 保持重定向顺序
|
|
300
317
|
.toArray(); // [2, 5, 3, 4, 6]
|
|
301
318
|
|
|
302
|
-
//
|
|
319
|
+
// 忽略重定向以倒序数组
|
|
303
320
|
from([6,4,3,5,2])
|
|
304
|
-
.redirect((element, index) => -index) //
|
|
305
|
-
.toUnorderd() //
|
|
321
|
+
.redirect((element: number, index: bigint) => -index) // 重定向为倒序
|
|
322
|
+
.toUnorderd() // 丢弃重定向顺序。此操作将忽略 `redirect`、`reverse`、`shuffle` 和 `translate` 操作
|
|
306
323
|
.toArray(); // [2, 5, 3, 4, 6]
|
|
307
324
|
|
|
308
|
-
//
|
|
325
|
+
// 反转流为数组
|
|
309
326
|
from([6, 4, 3, 5, 2])
|
|
310
327
|
.reverse() // 反转流
|
|
311
|
-
.toOrdered() //
|
|
328
|
+
.toOrdered() // 保证反转顺序
|
|
312
329
|
.toArray(); // [2, 5, 3, 4, 6]
|
|
313
330
|
|
|
314
|
-
//
|
|
331
|
+
// 覆盖打乱的流为数组
|
|
315
332
|
from([6, 4, 3, 5, 2])
|
|
316
333
|
.shuffle() // 打乱流
|
|
317
|
-
.sorted() //
|
|
334
|
+
.sorted() // 覆盖打乱顺序。此操作将覆盖 `redirect`、`reverse`、`shuffle` 和 `translate` 操作
|
|
318
335
|
.toArray(); // [2, 5, 3, 4, 6]
|
|
319
336
|
|
|
320
337
|
// 转换为窗口收集器
|
|
@@ -323,19 +340,19 @@ from([6, 4, 3, 5, 2]).toWindow();
|
|
|
323
340
|
// 转换为数值统计
|
|
324
341
|
from([6, 4, 3, 5, 2]).toNumericStatistics();
|
|
325
342
|
|
|
326
|
-
// 转换为
|
|
343
|
+
// 转换为 BigInt 统计
|
|
327
344
|
from([6n, 4n, 3n, 5n, 2n]).toBigintStatistics();
|
|
328
345
|
|
|
329
|
-
//
|
|
346
|
+
// 定义自定义收集器来收集数据
|
|
330
347
|
let customizedCollector = from([1, 2, 3, 4, 5]).toCollectable((generator: Generator<E>) => new CustomizedCollector(generator));
|
|
331
348
|
```
|
|
332
349
|
|
|
333
|
-
## Collectable
|
|
350
|
+
## Collectable 集合方法
|
|
334
351
|
|
|
335
352
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
336
353
|
|------|------|------------|------------|
|
|
337
|
-
| `anyMatch(predicate)` |
|
|
338
|
-
| `allMatch(predicate)` |
|
|
354
|
+
| `anyMatch(predicate)` | 是否有任何元素匹配 | O(n) | O(1) |
|
|
355
|
+
| `allMatch(predicate)` | 是否所有元素都匹配 | O(n) | O(1) |
|
|
339
356
|
| `count()` | 元素计数 | O(n) | O(1) |
|
|
340
357
|
| `isEmpty()` | 是否为空 | O(1) | O(1) |
|
|
341
358
|
| `findAny()` | 查找任意元素 | O(n) | O(1) |
|
|
@@ -344,44 +361,41 @@ let customizedCollector = from([1, 2, 3, 4, 5]).toCollectable((generator: Genera
|
|
|
344
361
|
| `forEach(action)` | 遍历所有元素 | O(n) | O(1) |
|
|
345
362
|
| `group(classifier)` | 按分类器分组 | O(n) | O(n) |
|
|
346
363
|
| `groupBy(keyExtractor, valueExtractor)` | 按键值提取器分组 | O(n) | O(n) |
|
|
347
|
-
| `join()` |
|
|
348
|
-
| `join(delimiter)` |
|
|
349
|
-
| `nonMatch(predicate)` |
|
|
350
|
-
| `partition(count)` |
|
|
364
|
+
| `join()` | 将元素连接为字符串 | O(n) | O(n) |
|
|
365
|
+
| `join(delimiter)` | 使用分隔符连接元素 | O(n) | O(n) |
|
|
366
|
+
| `nonMatch(predicate)` | 是否没有任何元素匹配 | O(n) | O(1) |
|
|
367
|
+
| `partition(count)` | 按计数分区 | O(n) | O(n) |
|
|
351
368
|
| `partitionBy(classifier)` | 按分类器分区 | O(n) | O(n) |
|
|
352
369
|
| `reduce(accumulator)` | 归约操作 | O(n) | O(1) |
|
|
353
|
-
| `reduce(identity, accumulator)` |
|
|
370
|
+
| `reduce(identity, accumulator)` | 使用初始值的归约操作 | O(n) | O(1) |
|
|
354
371
|
| `toArray()` | 转换为数组 | O(n) | O(n) |
|
|
355
|
-
| `toMap(keyExtractor, valueExtractor)` | 转换为Map | O(n) | O(n) |
|
|
356
|
-
| `toSet()` | 转换为Set | O(n) | O(n) |
|
|
372
|
+
| `toMap(keyExtractor, valueExtractor)` | 转换为 Map | O(n) | O(n) |
|
|
373
|
+
| `toSet()` | 转换为 Set | O(n) | O(n) |
|
|
357
374
|
| `write(stream)` | 写入流 | O(n) | O(1) |
|
|
358
375
|
|
|
359
376
|
```typescript
|
|
360
377
|
// Collectable 操作示例
|
|
361
378
|
const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
362
|
-
.filter(n => n % 2 === 0)
|
|
363
|
-
.toOrdered();
|
|
364
|
-
|
|
365
|
-
//
|
|
366
|
-
console.log(data.anyMatch(n => n > 5)); // true
|
|
367
|
-
console.log(data.allMatch(n => n < 20)); // true
|
|
379
|
+
.filter((n: number): boolean => n % 2 === 0)
|
|
380
|
+
.toOrdered(); // 匹配检查
|
|
381
|
+
console.log(data.anyMatch((n: number): boolean => n > 5)); // true
|
|
382
|
+
console.log(data.allMatch((n: number): boolean => n < 20)); // true
|
|
368
383
|
|
|
369
384
|
// 查找操作
|
|
370
|
-
data.findFirst().ifPresent(n => console.log(n)); // 2
|
|
371
|
-
data.findAny().ifPresent(n => console.log(n)); // 任意元素
|
|
385
|
+
data.findFirst().ifPresent((n: number): void => console.log(n)); // 2
|
|
386
|
+
data.findAny().ifPresent((n: number): void => console.log(n)); // 任意元素
|
|
372
387
|
|
|
373
388
|
// 分组操作
|
|
374
389
|
const grouped = data.groupBy(
|
|
375
|
-
n => n > 5 ? "large" : "small",
|
|
376
|
-
n => n * 2
|
|
377
|
-
);
|
|
378
|
-
// {small: [4, 8], large: [12, 16, 20]}
|
|
390
|
+
(n: number): string => (n > 5 ? "large" : "small"),
|
|
391
|
+
(n: number): number => n * 2
|
|
392
|
+
); // {small: [4, 8], large: [12, 16, 20]}
|
|
379
393
|
|
|
380
394
|
// 归约操作
|
|
381
|
-
const sum = data.reduce(0, (
|
|
395
|
+
const sum = data.reduce(0, (accumulator: number, n: number): number => accumulator + n); // 30
|
|
382
396
|
|
|
383
397
|
// 输出操作
|
|
384
|
-
data.join(", "); // "2, 4, 6, 8, 10"
|
|
398
|
+
data.join(", "); // "[2, 4, 6, 8, 10]"
|
|
385
399
|
```
|
|
386
400
|
|
|
387
401
|
## 统计分析方法
|
|
@@ -390,14 +404,14 @@ data.join(", "); // "2, 4, 6, 8, 10"
|
|
|
390
404
|
|
|
391
405
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
392
406
|
|------|------|------------|------------|
|
|
393
|
-
| `range()` |
|
|
407
|
+
| `range()` | 范围 | O(n) | O(1) |
|
|
394
408
|
| `variance()` | 方差 | O(n) | O(1) |
|
|
395
409
|
| `standardDeviation()` | 标准差 | O(n) | O(1) |
|
|
396
410
|
| `mean()` | 平均值 | O(n) | O(1) |
|
|
397
411
|
| `median()` | 中位数 | O(n log n) | O(n) |
|
|
398
412
|
| `mode()` | 众数 | O(n) | O(n) |
|
|
399
413
|
| `frequency()` | 频率分布 | O(n) | O(n) |
|
|
400
|
-
| `summate()` |
|
|
414
|
+
| `summate()` | 总和 | O(n) | O(1) |
|
|
401
415
|
| `quantile(quantile)` | 分位数 | O(n log n) | O(n) |
|
|
402
416
|
| `interquartileRange()` | 四分位距 | O(n log n) | O(n) |
|
|
403
417
|
| `skewness()` | 偏度 | O(n) | O(1) |
|
|
@@ -407,7 +421,6 @@ data.join(", "); // "2, 4, 6, 8, 10"
|
|
|
407
421
|
// 统计分析示例
|
|
408
422
|
const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
409
423
|
.toNumericStatistics();
|
|
410
|
-
|
|
411
424
|
console.log("平均值:", numbers.mean()); // 5.5
|
|
412
425
|
console.log("中位数:", numbers.median()); // 5.5
|
|
413
426
|
console.log("标准差:", numbers.standardDeviation()); // ~2.87
|
|
@@ -416,56 +429,58 @@ console.log("总和:", numbers.summate()); // 55
|
|
|
416
429
|
// 使用映射器的统计分析
|
|
417
430
|
const objects = from([
|
|
418
431
|
{ value: 10 },
|
|
419
|
-
{ value: 20 },
|
|
432
|
+
{ value: 20 },
|
|
420
433
|
{ value: 30 }
|
|
421
434
|
]).toNumericStatistics();
|
|
422
|
-
|
|
423
|
-
console.log("映射平均值:", objects.mean(obj => obj.value)); // 20
|
|
435
|
+
console.log("映射后的平均值:", objects.mean(obj => obj.value)); // 20
|
|
424
436
|
```
|
|
425
437
|
|
|
426
438
|
## 性能选择指南
|
|
427
439
|
|
|
428
440
|
### 选择无序收集器(性能优先)
|
|
441
|
+
|
|
429
442
|
```typescript
|
|
430
|
-
//
|
|
431
|
-
|
|
443
|
+
// 当不需要顺序保证时,使用无序收集器以获得最佳性能
|
|
444
|
+
let highPerformance = data
|
|
432
445
|
.filter(predicate)
|
|
433
446
|
.map(mapper)
|
|
434
|
-
.
|
|
447
|
+
.toUnordered(); // 最佳性能
|
|
435
448
|
```
|
|
436
449
|
|
|
437
450
|
### 选择有序收集器(需要顺序)
|
|
451
|
+
|
|
438
452
|
```typescript
|
|
439
453
|
// 当需要保持元素顺序时,使用有序收集器
|
|
440
|
-
|
|
454
|
+
let ordered = data.sorted(comparator);
|
|
441
455
|
```
|
|
442
456
|
|
|
443
457
|
### 选择窗口收集器(窗口操作)
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
458
|
+
|
|
459
|
+
```typescript
|
|
460
|
+
// 当需要窗口操作时
|
|
461
|
+
let window: WindowCollectable<number> = data
|
|
447
462
|
.toWindow()
|
|
448
463
|
.slide(5n, 2n); // 滑动窗口
|
|
449
464
|
```
|
|
450
465
|
|
|
451
466
|
### 选择统计分析(数值计算)
|
|
452
|
-
```typescript
|
|
453
|
-
// 需要进行统计分析时
|
|
454
|
-
const stats = data
|
|
455
|
-
.toNumericStatistics(); // 数值统计
|
|
456
467
|
|
|
457
|
-
|
|
458
|
-
|
|
468
|
+
```typescript
|
|
469
|
+
// 当需要统计分析时
|
|
470
|
+
let statistics: NumericStatistics<number> = data
|
|
471
|
+
.toNumericStatistics(); // 数值统计
|
|
472
|
+
let bigIntStatistics: BigintStatistics<bigint> = data
|
|
473
|
+
.toBigintStatistics(); // 大整数统计
|
|
459
474
|
```
|
|
460
475
|
|
|
461
476
|
[GitHub](https://github.com/eloyhere/semantic-typescript)
|
|
462
477
|
[NPMJS](https://www.npmjs.com/package/semantic-typescript)
|
|
463
478
|
|
|
464
|
-
##
|
|
479
|
+
## 重要注意事项
|
|
465
480
|
|
|
466
|
-
1. **排序操作的影响**:在有序收集器中,`sorted()` 操作会覆盖 `redirect`、`translate`、`shuffle`、`reverse`
|
|
467
|
-
2. **性能考虑**:如果不需要顺序保证,优先使用 `
|
|
468
|
-
3.
|
|
469
|
-
4.
|
|
481
|
+
1. **排序操作的影响**:在有序收集器中,`sorted()` 操作会覆盖 `redirect`、`translate`、`shuffle`、`reverse` 的效果。
|
|
482
|
+
2. **性能考虑**:如果不需要顺序保证,优先使用 `toUnordered()` 以获得更好的性能。
|
|
483
|
+
3. **内存使用**:排序操作需要额外的 O(n) 空间。
|
|
484
|
+
4. **实时数据处理**:Semantic 流适用于处理实时数据,并支持异步数据源。
|
|
470
485
|
|
|
471
|
-
这个库为 TypeScript
|
|
486
|
+
这个库为 TypeScript 开发者提供了强大而灵活的流处理能力,结合了函数式编程的优势和类型安全的保障。
|