semantic-typescript 0.5.3 → 0.7.0
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/asynchronous/collector.d.ts +235 -0
- package/dist/asynchronous/collector.js +811 -0
- package/dist/asynchronous/semantic.d.ts +257 -0
- package/dist/asynchronous/semantic.js +1863 -0
- package/dist/factory.d.ts +79 -37
- package/dist/factory.js +534 -277
- package/dist/guard.d.ts +24 -14
- package/dist/guard.js +73 -19
- package/dist/hook.d.ts +11 -6
- package/dist/hook.js +22 -5
- package/dist/index.d.ts +2 -2
- package/dist/index.js +2 -2
- package/dist/main.js +6 -4
- package/dist/optional.d.ts +2 -2
- package/dist/symbol.d.ts +19 -10
- package/dist/symbol.js +19 -10
- package/dist/synchronous/collector.d.ts +236 -0
- package/dist/{collector.js → synchronous/collector.js} +217 -193
- package/dist/{semantic.d.ts → synchronous/semantic.d.ts} +125 -130
- package/dist/{semantic.js → synchronous/semantic.js} +465 -574
- package/dist/utility.d.ts +7 -1
- package/dist/utility.js +1 -0
- package/package.json +3 -2
- package/readme.cn.md +213 -753
- package/readme.de.md +171 -441
- package/readme.es.md +171 -436
- package/readme.fr.md +170 -443
- package/readme.jp.md +177 -439
- package/readme.kr.md +177 -433
- package/readme.md +213 -1066
- package/readme.ru.md +174 -420
- package/readme.tw.md +175 -441
- package/dist/collector.d.ts +0 -236
- package/dist/map.d.ts +0 -76
- package/dist/map.js +0 -245
- package/dist/node.d.ts +0 -182
- package/dist/node.js +0 -918
- package/dist/set.d.ts +0 -19
- package/dist/set.js +0 -65
- package/dist/tree.d.ts +0 -82
- package/dist/tree.js +0 -257
package/readme.cn.md
CHANGED
|
@@ -1,753 +1,213 @@
|
|
|
1
|
-
# Semantic-TypeScript
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
let
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
|
136
|
-
|
|
|
137
|
-
| `
|
|
138
|
-
| `
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
|
165
|
-
| `
|
|
166
|
-
| `
|
|
167
|
-
| `
|
|
168
|
-
| `
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
| `Optional.ofNonNull<T>(value)` | 创建一个非 null 的 Optional | O(1) | O(1) |
|
|
215
|
-
|
|
216
|
-
```typescript
|
|
217
|
-
// Optional 使用示例
|
|
218
|
-
let empty: Optional<number> = Optional.empty();
|
|
219
|
-
let present: Optional<number> = Optional.of(42);
|
|
220
|
-
let nullable: Optional<string> = Optional.ofNullable<string>(null);
|
|
221
|
-
let nonNull: Optional<string> = Optional.ofNonNull("hello");
|
|
222
|
-
|
|
223
|
-
present.ifPresent((value: number): void => console.log(value)); // 输出 42
|
|
224
|
-
console.log(empty.get(100)); // 输出 100
|
|
225
|
-
```
|
|
226
|
-
|
|
227
|
-
### Collector 工厂方法
|
|
228
|
-
|
|
229
|
-
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
230
|
-
|------|------|------------|------------|
|
|
231
|
-
| `Collector.full(identity, accumulator, finisher)` | 创建一个完整收集器 | O(1) | O(1) |
|
|
232
|
-
| `Collector.shortable(identity, interruptor, accumulator, finisher)` | 创建一个可中断的收集器 | O(1) | O(1) |
|
|
233
|
-
| `useAnyMatch<E>(predicate)` | 创建一个短路的收集器,如果任何元素匹配谓词则返回 true | O(n) | O(1) |
|
|
234
|
-
| `useAllMatch<E>(predicate)` | 创建一个短路的收集器,如果所有元素匹配谓词则返回 true | O(n) | O(1) |
|
|
235
|
-
| `useCollect<E, A, R>(identity, accumulator, finisher)` | 使用 identity、accumulator、finisher 创建一个完整收集器 | O(1) | O(1) |
|
|
236
|
-
| `useCollect<E, A, R>(identity, interruptor, accumulator, finisher)` | 使用 identity、interruptor、accumulator、finisher 创建一个可短路的收集器 | O(1) | O(1) |
|
|
237
|
-
| `useCount<E>()` | 创建一个统计元素数量的完整收集器 | O(n) | O(1) |
|
|
238
|
-
| `useError<E>()` | 创建一个打印错误的收集器 | O(n) | O(1) |
|
|
239
|
-
| `useError<E>(accumulator)` | 创建一个打印累计错误的收集器 | O(n) | O(1) |
|
|
240
|
-
| `useError<E>(prefix, accumulator, suffix)` | 创建一个打印带前缀和后缀累计错误的收集器 | O(n) | O(1) |
|
|
241
|
-
| `useFindFirst<E>()` | 创建一个返回第一个元素的短路的收集器 | O(n) | O(1) |
|
|
242
|
-
| `useFindAny<E>()` | 创建一个返回任意元素的短路的收集器 | O(n) | O(1) |
|
|
243
|
-
| `useFindLast<E>()` | 创建一个返回最后一个元素的完整收集器 | O(n) | O(1) |
|
|
244
|
-
| `useFindMaximum<E>()` | 创建一个返回最大元素的完整收集器 | O(n) | O(1) |
|
|
245
|
-
| `useFindMaximum<E>(comparator?)` | 创建一个返回最大元素的完整收集器 | O(n) | O(1) |
|
|
246
|
-
| `useFindMinimum<E>()` | 创建一个返回最小元素的完整收集器 | O(n) | O(1) |
|
|
247
|
-
| `useFindMinimum<E>(comparator?)` | 创建一个返回最小元素的完整收集器 | O(n) | O(1) |
|
|
248
|
-
| `useForEach<E>(action)` | 创建一个为每个元素执行操作的完整收集器 | O(n) | O(1) |
|
|
249
|
-
| `useNoneMatch<E>(predicate)` | 创建一个短路的收集器,如果没有元素匹配谓词则返回 true | O(n) | O(1) |
|
|
250
|
-
| `useGroup<E, K>(classifier)` | 创建一个按分类器键对元素分组的完整收集器 | O(n) | O(n) |
|
|
251
|
-
| `useGroupBy<E, K, V>(keyExtractor, valueExtractor)` | 创建一个按提取的键对元素分组,并提取值的完整收集器 | O(n) | O(n) |
|
|
252
|
-
| `useJoin<E>()` | 创建一个使用默认格式将元素连接成字符串的完整收集器 | O(n) | O(1) |
|
|
253
|
-
| `useJoin<E>(delimiter)` | 创建一个使用分隔符连接元素的完整收集器 | O(n) | O(1) |
|
|
254
|
-
| `useJoin<E>(prefix, delimiter, suffix)` | 创建一个使用前缀、分隔符、后缀连接元素的完整收集器 | O(n) | O(1) |
|
|
255
|
-
| `useJoin<E>(prefix, accumulator, suffix)` | 创建一个通过自定义累加器连接元素的完整收集器 | O(n) | O(1) |
|
|
256
|
-
| `useLog<E>()` | 创建一个使用默认格式将元素记录到控制台的完整收集器 | O(n) | O(1) |
|
|
257
|
-
| `useLog<E>(accumulator)` | 创建一个通过自定义累加器记录元素的完整收集器 | O(n) | O(1) |
|
|
258
|
-
| `useLog<E>(prefix, accumulator, suffix)` | 创建一个通过累加器记录元素,并带前缀/后缀的完整收集器 | O(n) | O(1) |
|
|
259
|
-
| `usePartition<E>(count)` | 创建一个将元素分割为指定大小块的完整收集器 | O(n) | O(n) |
|
|
260
|
-
| `usePartitionBy<E>(classifier)` | 创建一个按分类器结果对元素分区的完整收集器 | O(n) | O(n) |
|
|
261
|
-
| `useReduce<E>(accumulator)` | 创建一个无初始值归约元素的完整收集器 | O(n) | O(1) |
|
|
262
|
-
| `useReduce<E>(identity, accumulator)` | 创建一个带有初始值归约元素的完整收集器 | O(n) | O(1) |
|
|
263
|
-
| `useReduce<E, R>(identity, accumulator, finisher)` | 创建一个带有 identity、accumulator、finisher 归约元素的完整收集器 | O(n) | O(1) |
|
|
264
|
-
| `useToArray<E>()` | 创建一个将元素收集到数组的完整收集器 | O(n) | O(n) |
|
|
265
|
-
| `useToMap<E, K, V>(keyExtractor, valueExtractor)` | 创建一个将元素收集到 Map 的完整收集器 | O(n) | O(n) |
|
|
266
|
-
| `useToSet<E>()` | 创建一个将元素收集到 Set 的完整收集器 | O(n) | O(n) |
|
|
267
|
-
| `useWrite<E, S>(stream)` | 创建一个将元素写入流的完整收集器 | O(n) | O(1) |
|
|
268
|
-
| `useWrite<E, S>(stream, accumulator)` | 创建一个通过自定义累加器将元素写入流的完整收集器 | O(n) | O(1) |
|
|
269
|
-
| `useNumericAverage<E>(mapper)` | 创建一个通过映射器计算数字平均值的完整收集器 | O(n) | O(1) |
|
|
270
|
-
| `useNumericAverage<E>()` | 创建一个计算数字平均值的完整收集器 | O(n) | O(1) |
|
|
271
|
-
| `useBigIntAverage<E>(mapper)` | 创建一个通过映射器计算 BigInt 平均值的完整收集器 | O(n) | O(1) |
|
|
272
|
-
| `useBigIntAverage<E>()` | 创建一个计算 BigInt 平均值的完整收集器 | O(n) | O(1) |
|
|
273
|
-
| `useFrequency<E>()` | 创建一个统计元素频率的完整收集器 | O(n) | O(n) |
|
|
274
|
-
| `useNumericSummate<E>()` | 创建一个对数字元素求和的完整收集器 | O(n) | O(1) |
|
|
275
|
-
| `useNumericSummate<E>(mapper)` | 创建一个对映射后的数字值求和的完整收集器 | O(n) | O(1) |
|
|
276
|
-
| `useBigIntSummate<E>()` | 创建一个对数字元素求和的完整收集器 | O(n) | O(1) |
|
|
277
|
-
| `useBigIntSummate<E>(mapper)` | 创建一个对映射后的数字值求和的完整收集器 | O(n) | O(1) |
|
|
278
|
-
| `useNumericAverage<E>()` | 创建一个计算数字平均值的完整收集器 | O(n) | O(1) |
|
|
279
|
-
| `useNumericAverage<E>(mapper)` | 创建一个通过映射器计算数字平均值的完整收集器 | O(n) | O(1) |
|
|
280
|
-
| `useBigIntAverage<E>()` | 创建一个计算 BigInt 平均值的完整收集器 | O(n) | O(1) |
|
|
281
|
-
| `useBigIntAverage<E>(mapper)` | 创建一个通过映射器计算 BigInt 平均值的完整收集器 | O(n) | O(1) |
|
|
282
|
-
| `useFrequency<E>()` | 创建一个统计元素频率的完整收集器 | O(n) | O(n) |
|
|
283
|
-
| `useNumericMode<E>()` | 创建一个计算数字众数的完整收集器 | O(n) | O(n) |
|
|
284
|
-
| `useNumericMode<E>(mapper)` | 创建一个通过映射器计算数字众数的完整收集器 | O(n) | O(n) |
|
|
285
|
-
| `useBigIntMode<E>()` | 创建一个计算 BigInt 众数的完整收集器 | O(n) | O(n) |
|
|
286
|
-
| `useBigIntMode<E>(mapper)` | 创建一个通过映射器计算 BigInt 众数的完整收集器 | O(n) | O(n) |
|
|
287
|
-
| `useNumericVariance<E>()` | 创建一个计算数字方差的完整收集器 | O(n) | O(1) |
|
|
288
|
-
| `useNumericVariance<E>(mapper)` | 创建一个通过映射器计算数字方差的完整收集器 | O(n) | O(1) |
|
|
289
|
-
| `useBigIntVariance<E>()` | 创建一个计算 BigInt 方差的完整收集器 | O(n) | O(1) |
|
|
290
|
-
| `useBigIntVariance<E>(mapper)` | 创建一个通过映射器计算 BigInt 方差的完整收集器 | O(n) | O(1) |
|
|
291
|
-
| `useNumericStandardDeviation<E>()` | 创建一个计算数字标准差的完整收集器 | O(n) | O(1) |
|
|
292
|
-
| `useNumericStandardDeviation<E>(mapper)` | 创建一个通过映射器计算数字标准差的完整收集器 | O(n) | O(1) |
|
|
293
|
-
| `useBigIntStandardDeviation<E>()` | 创建一个计算 BigInt 标准差的完整收集器 | O(n) | O(1) |
|
|
294
|
-
| `useBigIntStandardDeviation<E>(mapper)` | 创建一个通过映射器计算 BigInt 标准差的完整收集器 | O(n) | O(1) |
|
|
295
|
-
| `useNumericMedian<E>()` | 创建一个计算数字中位数的完整收集器 | O(n) | O(1) |
|
|
296
|
-
| `useNumericMedian<E>(mapper)` | 创建一个通过映射器计算数字中位数的完整收集器 | O(n) | O(1) |
|
|
297
|
-
| `useBigIntMedian<E>()` | 创建一个计算 BigInt 中位数的完整收集器 | O(n) | O(1) |
|
|
298
|
-
| `useBigIntMedian<E>(mapper)` | 创建一个通过映射器计算 BigInt 中位数的完整收集器 | O(n) | O(1) |
|
|
299
|
-
| `useToGeneratorFunction<E>()` | 创建一个将流转换为生成器函数的完整收集器 | O(n) | O(1) |
|
|
300
|
-
| `useToAsyncGeneratorFunction<E>()` | 创建一个将流转换为异步生成器函数的完整收集器 | O(n) | O(1) |
|
|
301
|
-
|
|
302
|
-
```typescript
|
|
303
|
-
// 收集器转换示例
|
|
304
|
-
let numbers: Semantic<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
|
|
305
|
-
|
|
306
|
-
// 性能优先:使用无序收集器
|
|
307
|
-
let unordered: UnorderedCollectable<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5])
|
|
308
|
-
.filter((n: number): boolean => n > 3)
|
|
309
|
-
.toUnoredered();
|
|
310
|
-
|
|
311
|
-
// 需要排序:使用有序收集器
|
|
312
|
-
let ordered: OrderedCollectable<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5])
|
|
313
|
-
.sorted();
|
|
314
|
-
|
|
315
|
-
// 统计元素数量
|
|
316
|
-
let count: Collector<number, number, number> = useCount();
|
|
317
|
-
count.collect(from([1,2,3,4,5])); // 从流中统计
|
|
318
|
-
count.collect([1,2,3,4,5]); // 从可迭代对象中统计
|
|
319
|
-
|
|
320
|
-
// 查找第一个元素
|
|
321
|
-
let findFirst: Collector<number, number, number> = useFindFirst();
|
|
322
|
-
find.collect(from([1,2,3,4,5])); // 从流中查找第一个元素
|
|
323
|
-
find.collect([1,2,3,4,5]); // 从可迭代对象中查找第一个元素
|
|
324
|
-
|
|
325
|
-
// 计算元素总和
|
|
326
|
-
let summate: Collector<number, number, number> = useSummate();
|
|
327
|
-
summate.collect(from([1,2,3,4,5])); // 从流中求和
|
|
328
|
-
summate.collect([1,2,3,4,5]); // 从可迭代对象中求和
|
|
329
|
-
|
|
330
|
-
// 计算元素平均值
|
|
331
|
-
let average: Collector<number, number, number> = useNumericAverage();
|
|
332
|
-
average.collect(from([1,2,3,4,5])); // 从流中求平均
|
|
333
|
-
average.collect([1,2,3,4,5]); // 从可迭代对象中求平均
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
## Collector 类方法
|
|
337
|
-
|
|
338
|
-
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
339
|
-
|------------|------------|------------|------------|
|
|
340
|
-
| `collect(stream)` | 从流中收集元素 | O(n) | O(1) |
|
|
341
|
-
| `collect(iterable)` | 从可迭代对象中收集元素 | O(n) | O(1) |
|
|
342
|
-
| `collect(generator)` | 从生成器中收集元素 | O(n) | O(1) |
|
|
343
|
-
| `collect(semantic)` | 从 semantic 流中收集元素 | O(n) | O(1) |
|
|
344
|
-
| `collect(collectable)` | 从 collectable 流中收集元素 | O(n) | O(1) |
|
|
345
|
-
| `collect(start, endExelusive)` | 从范围中收集元素 | O(n) | O(1) |
|
|
346
|
-
|
|
347
|
-
### Semantic 工厂方法
|
|
348
|
-
|
|
349
|
-
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
350
|
-
|------|------|------------|------------|
|
|
351
|
-
| `animationFrame(period: number, delay: number = 0)` | 创建一个定时的动画帧流 | O(1)* | O(1) |
|
|
352
|
-
| `attribute(target)` | 从对象的深层属性创建流 | O(n) | O(1) |
|
|
353
|
-
| `blob(blob, chunkSize)` | 从 Blob 创建流 | O(n) | O(chunkSize) |
|
|
354
|
-
| `empty<E>()` | 创建一个空流 | O(1) | O(1) |
|
|
355
|
-
| `fill<E>(element, count)` | 创建一个填充流 | O(n) | O(1) |
|
|
356
|
-
| `from<E>(iterable)` | 从可迭代对象创建流 | O(1) | O(1) |
|
|
357
|
-
| `interval(period, delay?)` | 创建一个定时间隔流 | O(1)* | O(1) |
|
|
358
|
-
| `iterate<E>(generator)` | 从生成器创建流 | O(1) | O(1) |
|
|
359
|
-
| `promise<E>(promise)` | 从 Promise 创建流 | O(1) | O(1) |
|
|
360
|
-
| `range(start, end, step)` | 创建数值范围流 | O(n) | O(1) |
|
|
361
|
-
| `websocket(websocket)` | 从 WebSocket 创建流 | O(1) | O(1) |
|
|
362
|
-
|
|
363
|
-
```typescript
|
|
364
|
-
// Semantic 工厂方法使用示例
|
|
365
|
-
|
|
366
|
-
// 从定时动画帧创建流
|
|
367
|
-
animationFrame(1000)
|
|
368
|
-
.toUnordered()
|
|
369
|
-
.forEach((frame): void => console.log(frame));
|
|
370
|
-
|
|
371
|
-
// 从 Blob 创建流(分块读取)
|
|
372
|
-
blob(someBlob, 1024n)
|
|
373
|
-
.toUnordered()
|
|
374
|
-
.write(WritableStream)
|
|
375
|
-
.then(callback) // 写入流成功
|
|
376
|
-
.catch(callback); // 写入流失败
|
|
377
|
-
|
|
378
|
-
// 创建一个空流,在与其他流连接之前不会执行
|
|
379
|
-
empty<string>()
|
|
380
|
-
.toUnordered()
|
|
381
|
-
.join(); //[]
|
|
382
|
-
|
|
383
|
-
// 创建一个填充流
|
|
384
|
-
let filledStream = fill("hello", 3); // "hello", "hello", "hello"
|
|
385
|
-
|
|
386
|
-
// 创建一个具有初始 2 秒延迟和 5 秒执行周期的定时流,基于定时器机制实现;可能因系统调度精度限制而出现时间漂移。
|
|
387
|
-
let intervalStream = interval(5000, 2000);
|
|
388
|
-
|
|
389
|
-
// 从可迭代对象创建流
|
|
390
|
-
let numberStream = from([1, 2, 3, 4, 5]);
|
|
391
|
-
let stringStream = from(new Set(["Alex", "Bob"]));
|
|
392
|
-
|
|
393
|
-
// 从已解析的 Promise 创建流
|
|
394
|
-
let promisedStream: Semantic<Array<number>> = promise(Promise.resolve([1, 2, 3, 4, 5]));
|
|
395
|
-
|
|
396
|
-
// 创建范围流
|
|
397
|
-
let rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
398
|
-
|
|
399
|
-
// WebSocket 事件流
|
|
400
|
-
let ws = new WebSocket("ws://localhost:8080");
|
|
401
|
-
websocket(ws)
|
|
402
|
-
.filter((event): boolean => event.type === "message"); // 仅监听消息事件
|
|
403
|
-
.toUnordered() // 通常事件不需要有序
|
|
404
|
-
.forEach((event): void => receive(event)); // 接收消息
|
|
405
|
-
```
|
|
406
|
-
|
|
407
|
-
## Semantic 类方法
|
|
408
|
-
|
|
409
|
-
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
410
|
-
|------|------|------------|------------|
|
|
411
|
-
| `concat(semantic)` | 连接两个流 | O(n) | O(1) |
|
|
412
|
-
| `concat(iterable)` | 从可迭代对象连接 | O(n) | O(1) |
|
|
413
|
-
| `distinct()` | 去重 | O(n) | O(n) |
|
|
414
|
-
| `distinct(comparator)` | 使用比较器去重 | O(n²) | O(n) |
|
|
415
|
-
| `dropWhile(predicate)` | 丢弃满足条件的元素 | O(n) | O(1) |
|
|
416
|
-
| `filter(predicate)` | 过滤元素 | O(n) | O(1) |
|
|
417
|
-
| `flat(mapper)` | 扁平化映射 | O(n × m) | O(1) |
|
|
418
|
-
| `flatMap(mapper)` | 扁平化映射为新类型 | O(n × m) | O(1) |
|
|
419
|
-
| `limit(n)` | 限制元素数量 | O(n) | O(1) |
|
|
420
|
-
| `map(mapper)` | 映射转换 | O(n) | O(1) |
|
|
421
|
-
| `peek(consumer)` | 查看元素 | O(n) | O(1) |
|
|
422
|
-
| `redirect(redirector)` | 重定向索引 | O(n) | O(1) |
|
|
423
|
-
| `reverse()` | 反转流 | O(n) | O(1) |
|
|
424
|
-
| `shuffle()` | 随机洗牌 | O(n) | O(1) |
|
|
425
|
-
| `shuffle(mapper)` | 使用映射器洗牌 | O(n) | O(1) |
|
|
426
|
-
| `skip(n)` | 跳过前 n 个元素 | O(n) | O(1) |
|
|
427
|
-
| `sorted()` | 排序 | O(n log n) | O(n) |
|
|
428
|
-
| `sorted(comparator)` | 使用比较器排序 | O(n log n) | O(n) |
|
|
429
|
-
| `sub(start, end)` | 获取子流 | O(n) | O(1) |
|
|
430
|
-
| `takeWhile(predicate)` | 获取满足条件的元素 | O(n) | O(1) |
|
|
431
|
-
| `translate(offset)` | 平移索引 | O(n) | O(1) |
|
|
432
|
-
| `translate(translator)` | 使用翻译器平移索引 | O(n) | O(1) |
|
|
433
|
-
|
|
434
|
-
```typescript
|
|
435
|
-
// Semantic 操作示例
|
|
436
|
-
let result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
437
|
-
.filter((n: number): boolean => n % 2 === 0) // 过滤偶数
|
|
438
|
-
.map((n: number): number => n * 2) // 乘以 2
|
|
439
|
-
.skip(1) // 跳过第一个
|
|
440
|
-
.limit(3) // 限制为 3 个元素
|
|
441
|
-
.toUnordered() // 转换为无序收集器
|
|
442
|
-
.toArray(); // 转换为数组
|
|
443
|
-
// 结果: [8, 12, 20]
|
|
444
|
-
|
|
445
|
-
// 复杂操作示例
|
|
446
|
-
let complexResult = range(1, 100, 1)
|
|
447
|
-
.flatMap((n: number): Semantics<number> => from([n, n * 2])) // 将每个元素映射为两个
|
|
448
|
-
.distinct() // 去重
|
|
449
|
-
.shuffle() // 打乱顺序
|
|
450
|
-
.takeWhile((n: number): boolean => n < 50) // 取出小于 50 的元素
|
|
451
|
-
.toOrdered() // 转换为有序收集器
|
|
452
|
-
.toArray(); // 转换为数组
|
|
453
|
-
```
|
|
454
|
-
|
|
455
|
-
## Semantic 转换方法
|
|
456
|
-
|
|
457
|
-
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
458
|
-
|------------|------------|------------|------------|
|
|
459
|
-
| `sorted()` | 转换为有序收集器 | O(n log n) | O(n) |
|
|
460
|
-
| `sorted(comparator)` | 使用比较器转换为有序收集器 | O(n log n) | O(n) |
|
|
461
|
-
| `toUnordered()` | 转换为无序收集器 | O(1) | O(1) |
|
|
462
|
-
| `toOrdered()` | 转换为有序收集器 | O(1) | O(1) |
|
|
463
|
-
| `toNumericStatistics()` | 转换为数字统计 | O(n) | O(1) |
|
|
464
|
-
| `toBigintStatistics()` | 转换为 BigInt 统计 | O(n) | O(1) |
|
|
465
|
-
| `toWindow()` | 转换为窗口收集器 | O(1) | O(1) |
|
|
466
|
-
| `toCollectable()` | 转换为 `UnorderdCollectable` | O(n) | O(1) |
|
|
467
|
-
| `toCollectable(mapper)` | 转换为自定义的 collectable | O(n) | O(1) |
|
|
468
|
-
|
|
469
|
-
```typescript
|
|
470
|
-
// 转换为升序排序数组
|
|
471
|
-
from([6,4,3,5,2]) // 创建流
|
|
472
|
-
.sorted() // 将流按升序排序
|
|
473
|
-
.toArray(); // [2, 3, 4, 5, 6]
|
|
474
|
-
|
|
475
|
-
// 转换为降序排序数组
|
|
476
|
-
from([6,4,3,5,2]) // 创建流
|
|
477
|
-
.soted((a: number, b: number): number => b - a) // 将流按降序排序
|
|
478
|
-
.toArray(); // [6, 5, 4, 3, 2]
|
|
479
|
-
|
|
480
|
-
// 重定向到反向数组
|
|
481
|
-
from([6,4,3,5,2])
|
|
482
|
-
.redirect((element, index): bigint => -index) // 重定向到反序
|
|
483
|
-
.toOrderd() // 保持重定向后的顺序
|
|
484
|
-
.toArray(); // [2, 5, 3, 4, 6]
|
|
485
|
-
|
|
486
|
-
// 忽略重定向以反转数组
|
|
487
|
-
from([6,4,3,5,2])
|
|
488
|
-
.redirect((element: number, index: bigint) => -index) // 重定向到反序
|
|
489
|
-
.toUnorderd() // 丢弃重定向顺序。此操作将忽略 `redirect`、`reverse`、`shuffle` 和 `translate` 操作
|
|
490
|
-
.toArray(); // [2, 5, 3, 4, 6]
|
|
491
|
-
|
|
492
|
-
// 反转流为数组
|
|
493
|
-
from([6, 4, 3, 5, 2])
|
|
494
|
-
.reverse() // 反转流
|
|
495
|
-
.toOrdered() // 保证反转后的顺序
|
|
496
|
-
.toArray(); // [2, 5, 3, 4, 6]
|
|
497
|
-
|
|
498
|
-
// 覆盖洗牌流到数组
|
|
499
|
-
from([6, 4, 3, 5, 2])
|
|
500
|
-
.shuffle() // 打乱流
|
|
501
|
-
.sorted() // 覆盖洗牌顺序。此操作将覆盖 `redirect`、`reverse`、`shuffle` 和 `translate` 操作
|
|
502
|
-
.toArray(); // [2, 5, 3, 4, 6]
|
|
503
|
-
|
|
504
|
-
// 转换为窗口收集器
|
|
505
|
-
from([6, 4, 3, 5, 2]).toWindow();
|
|
506
|
-
|
|
507
|
-
// 转换为数字统计
|
|
508
|
-
from([6, 4, 3, 5, 2]).toNumericStatistics();
|
|
509
|
-
|
|
510
|
-
// 转换为 BigInt 统计
|
|
511
|
-
from([6n, 4n, 3n, 5n, 2n]).toBigintStatistics();
|
|
512
|
-
|
|
513
|
-
// 定义自定义收集器来收集数据
|
|
514
|
-
let customizedCollector = from([1, 2, 3, 4, 5]).toCollectable((generator: Generator<E>) => new CustomizedCollector(generator));
|
|
515
|
-
```
|
|
516
|
-
|
|
517
|
-
## Collectable 收集方法
|
|
518
|
-
|
|
519
|
-
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
520
|
-
|------|------|------------|------------|
|
|
521
|
-
| `anyMatch(predicate)` | 是否有任何元素匹配谓词 | O(n) | O(1) |
|
|
522
|
-
| `allMatch(predicate)` | 是否所有元素都匹配谓词 | O(n) | O(1) |
|
|
523
|
-
| `collect(collector)` | 使用给定的收集器收集元素 | O(n) | O(1) |
|
|
524
|
-
| `collect(identity, accumulator, finisher)` | 使用 identity、accumulator 和 finisher 收集元素 | O(n) | O(1) |
|
|
525
|
-
| `collect(identity, interruptor, accumulator, finisher)` | 使用 identity、interruptor、accumulator 和 finisher 收集元素 | O(n) | O(1) |
|
|
526
|
-
| `count()` | 统计元素数量 | O(n) | O(1) |
|
|
527
|
-
| `error()` | 使用默认错误格式将元素记录到控制台 | O(n) | O(1) |
|
|
528
|
-
| `error(accumulator)` | 通过自定义累加器错误格式记录元素 | O(n) | O(1) |
|
|
529
|
-
| `error(prefix, accumulator, suffix)` | 使用前缀、自定义累加器和后缀记录元素 | O(n) | O(1) |
|
|
530
|
-
| `isEmpty()` | 检查 collectable 是否为空 | O(n) | O(1) |
|
|
531
|
-
| `findAny()` | 在 collectable 中查找任意元素 | O(n) | O(1) |
|
|
532
|
-
| `findFirst()` | 在 collectable 中查找第一个元素 | O(n) | O(1) |
|
|
533
|
-
| `findLast()` | 在 collectable 中查找最后一个元素 | O(n) | O(1) |
|
|
534
|
-
| `findMaximum()` | 在 collectable 中查找最大元素 | O(n) | O(1) |
|
|
535
|
-
| `findMaximum(comparator)` | 使用比较器在 collectable 中查找最大元素 | O(n) | O(1) |
|
|
536
|
-
| `findMinimum()` | 在 collectable 中查找最小元素 | O(n) | O(1) |
|
|
537
|
-
| `findMinimum(comparator)` | 使用比较器在 collectable 中查找最小元素 | O(n) | O(1) |
|
|
538
|
-
| `forEach(action)` | 使用消费者或二元消费者遍历所有元素 | O(n) | O(1) |
|
|
539
|
-
| `group(classifier)` | 通过分类器函数对元素分组 | O(n) | O(n) |
|
|
540
|
-
| `groupBy(keyExtractor, valueExtractor)` | 通过键和值提取器对元素分组 | O(n) | O(n) |
|
|
541
|
-
| `join()` | 使用默认格式将元素连接成字符串 | O(n) | O(n) |
|
|
542
|
-
| `join(delimiter)` | 使用分隔符将元素连接成字符串 | O(n) | O(n) |
|
|
543
|
-
| `join(prefix, delimiter, suffix)` | 使用前缀、分隔符和后缀连接元素 | O(n) | O(n) |
|
|
544
|
-
| `join(prefix, accumulator, suffix)` | 通过自定义累加器连接元素,并带前缀和后缀 | O(n) | O(n) |
|
|
545
|
-
| `log()` | 使用默认格式将元素记录到控制台 | O(n) | O(1) |
|
|
546
|
-
| `log(accumulator)` | 通过自定义累加器记录元素 | O(n) | O(1) |
|
|
547
|
-
| `log(prefix, accumulator, suffix)` | 使用前缀、自定义累加器和后缀记录元素 | O(n) | O(1) |
|
|
548
|
-
| `nonMatch(predicate)` | 是否有任何元素不匹配谓词 | O(n) | O(1) |
|
|
549
|
-
| `partition(count)` | 将元素分割为指定大小的块 | O(n) | O(n) |
|
|
550
|
-
| `partitionBy(classifier)` | 通过分类器函数对元素分区 | O(n) | O(n) |
|
|
551
|
-
| `reduce(accumulator)` | 使用累加器归约元素(无初始值) | O(n) | O(1) |
|
|
552
|
-
| `reduce(identity, accumulator)` | 使用初始值和累加器归约元素 | O(n) | O(1) |
|
|
553
|
-
| `reduce(identity, accumulator, finisher)` | 使用初始值、累加器和 finisher 归约元素 | O(n) | O(1) |
|
|
554
|
-
| `semantic()` | 将 collectable 转换为语义对象 | O(1) | O(1) |
|
|
555
|
-
| `source()` | 获取 collectable 的源 | O(1) | O(1) |
|
|
556
|
-
| `toArray()` | 将元素转换为数组 | O(n) | O(n) |
|
|
557
|
-
| `toMap(keyExtractor, valueExtractor)` | 通过键和值提取器将元素转换为 Map | O(n) | O(n) |
|
|
558
|
-
| `toSet()` | 将元素转换为 Set | O(n) | O(n) |
|
|
559
|
-
| `write(stream)` | 将元素写入流(默认格式) | O(n) | O(1) |
|
|
560
|
-
| `write(stream, accumulator)` | 通过自定义累加器将元素写入流 | O(n) | O(1) |
|
|
561
|
-
|
|
562
|
-
```typescript
|
|
563
|
-
// Collectable 操作示例
|
|
564
|
-
let data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
565
|
-
.filter((n: number): boolean => n % 2 === 0)
|
|
566
|
-
.toOrdered();
|
|
567
|
-
|
|
568
|
-
// 匹配检查
|
|
569
|
-
console.log(data.anyMatch((n: number): boolean => n > 5)); // true
|
|
570
|
-
console.log(data.allMatch((n: number): boolean => n < 20)); // true
|
|
571
|
-
|
|
572
|
-
// 查找操作
|
|
573
|
-
data.findFirst().ifPresent((n: number): void => console.log(n)); // 2
|
|
574
|
-
data.findAny().ifPresent((n: number): void => console.log(n)); // 任意元素
|
|
575
|
-
|
|
576
|
-
// 分组操作
|
|
577
|
-
let grouped = data.groupBy(
|
|
578
|
-
(n: number): string => n > 5 ? "large" : "small",
|
|
579
|
-
(n: number): number => n * 2
|
|
580
|
-
);
|
|
581
|
-
// {small: [4, 8], large: [12, 16, 20]}
|
|
582
|
-
|
|
583
|
-
// 归约操作
|
|
584
|
-
let sum = data.reduce(0, (accumulator: number, n: number): number => accumulator + n); // 30
|
|
585
|
-
|
|
586
|
-
// 输出操作
|
|
587
|
-
data.join(", "); // "[2, 4, 6, 8, 10]"
|
|
588
|
-
```
|
|
589
|
-
|
|
590
|
-
## Unordered Collectable 方法
|
|
591
|
-
|
|
592
|
-
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
593
|
-
|------------|------------|------------|------------|
|
|
594
|
-
| `*` | 遍历所有元素 | O(n) | O(1) |
|
|
595
|
-
| `*` | 异步遍历所有元素 | O(n) | O(1) |
|
|
596
|
-
|
|
597
|
-
## Ordered Collectable 方法
|
|
598
|
-
|
|
599
|
-
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
600
|
-
|------------|------------|------------|------------|
|
|
601
|
-
| `*` | 遍历所有元素 | O(n) | O(1) |
|
|
602
|
-
| `*` | 异步遍历所有元素 | O(n) | O(1) |
|
|
603
|
-
|
|
604
|
-
## 统计分析方法
|
|
605
|
-
|
|
606
|
-
### Statistics 方法
|
|
607
|
-
|
|
608
|
-
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
609
|
-
|------------|------------|------------|------------|
|
|
610
|
-
| `*` | 遍历所有元素 | O(n) | O(1) |
|
|
611
|
-
| `*` | 异步遍历所有元素 | O(n) | O(1) |
|
|
612
|
-
| `count()` | 统计元素数量 | O(n) | O(1) |
|
|
613
|
-
| `frequency()` | 频率分布 | O(n) | O(n) |
|
|
614
|
-
|
|
615
|
-
### NumericStatistics 方法
|
|
616
|
-
|
|
617
|
-
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
618
|
-
|------|------|------------|------------|
|
|
619
|
-
| `*` | 遍历所有元素 | O(n) | O(1) |
|
|
620
|
-
| `*` | 异步遍历所有元素 | O(n) | O(1) |
|
|
621
|
-
| `average()` | 计算元素平均值 | O(n) | O(1) |
|
|
622
|
-
| `average(mapper)` | 使用映射器计算元素平均值 | O(n) | O(1) |
|
|
623
|
-
| `range()` | 计算元素范围 | O(n) | O(1) |
|
|
624
|
-
| `range(mapper)` | 使用映射器计算元素范围 | O(n) | O(1) |
|
|
625
|
-
| `variance()` | 计算元素方差 | O(n) | O(1) |
|
|
626
|
-
| `variance(mapper)` | 使用映射器计算元素方差 | O(n) | O(1) |
|
|
627
|
-
| `standardDeviation()` | 计算元素标准差 | O(n) | O(1) |
|
|
628
|
-
| `standardDeviation(mapper)` | 使用映射器计算元素标准差 | O(n) | O(1) |
|
|
629
|
-
| `mean()` | 计算元素均值 | O(n) | O(1) |
|
|
630
|
-
| `mean(mapper)` | 使用映射器计算元素均值 | O(n) | O(1) |
|
|
631
|
-
| `median()` | 计算元素中位数 | O(n) | O(1) |
|
|
632
|
-
| `median(mapper)` | 使用映射器计算元素中位数 | O(n) | O(1) |
|
|
633
|
-
| `mode()` | 计算元素众数 | O(n) | O(1) |
|
|
634
|
-
| `mode(mapper)` | 使用映射器计算元素众数 | O(n) | O(1) |
|
|
635
|
-
| `summate()` | 计算元素总和 | O(n) | O(1) |
|
|
636
|
-
| `summate(mapper)` | 使用映射器计算元素总和 | O(n) | O(1) |
|
|
637
|
-
| `quantile(quantile)` | 计算元素分位数 | O(n) | O(1) |
|
|
638
|
-
| `quantile(quantile, mapper)` | 使用映射器计算元素分位数 | O(n) | O(1) |
|
|
639
|
-
| `interquartileRange()` | 计算元素四分位距 | O(n) | O(1) |
|
|
640
|
-
| `interquartileRange(mapper)` | 使用映射器计算元素四分位距 | O(n) | O(1) |
|
|
641
|
-
| `skewness()` | 计算元素偏度 | O(n) | O(1) |
|
|
642
|
-
| `skewness(mapper)` | 使用映射器计算元素偏度 | O(n) | O(1) |
|
|
643
|
-
| `kurtosis()` | 计算元素峰度 | O(n) | O(1) |
|
|
644
|
-
| `kurtosis(mapper)` | 使用映射器计算元素峰度 | O(n) | O(1) |
|
|
645
|
-
|
|
646
|
-
```typescript
|
|
647
|
-
// 统计分析示例
|
|
648
|
-
let numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
649
|
-
.toNumericStatistics();
|
|
650
|
-
|
|
651
|
-
console.log("平均值:", numbers.mean()); // 5.5
|
|
652
|
-
console.log("中位数:", numbers.median()); // 5.5
|
|
653
|
-
console.log("标准差:", numbers.standardDeviation()); // ~2.87
|
|
654
|
-
console.log("总和:", numbers.summate()); // 55
|
|
655
|
-
|
|
656
|
-
// 使用映射器的统计分析
|
|
657
|
-
let objects = from([
|
|
658
|
-
{ value: 10 },
|
|
659
|
-
{ value: 20 },
|
|
660
|
-
{ value: 30 }
|
|
661
|
-
]).toNumericStatistics();
|
|
662
|
-
|
|
663
|
-
console.log("映射后的平均值:", objects.mean(obj => obj.value)); // 20
|
|
664
|
-
```
|
|
665
|
-
|
|
666
|
-
### BigintStatistics 方法
|
|
667
|
-
|
|
668
|
-
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
669
|
-
|------------|------------|------------|------------|
|
|
670
|
-
| `*` | 遍历所有元素 | O(n) | O(1) |
|
|
671
|
-
| `*` | 异步遍历所有元素 | O(n) | O(1) |
|
|
672
|
-
| `average()` | 计算元素平均值 | O(n) | O(1) |
|
|
673
|
-
| `average(mapper)` | 使用映射器计算元素平均值 | O(n) | O(1) |
|
|
674
|
-
| `range()` | 计算元素范围 | O(n) | O(1) |
|
|
675
|
-
| `range(mapper)` | 使用映射器计算元素范围 | O(n) | O(1) |
|
|
676
|
-
| `variance()` | 计算元素方差 | O(n) | O(1) |
|
|
677
|
-
| `variance(mapper)` | 使用映射器计算元素方差 | O(n) | O(1) |
|
|
678
|
-
| `standardDeviation()` | 计算元素标准差 | O(n) | O(1) |
|
|
679
|
-
| `standardDeviation(mapper)` | 使用映射器计算元素标准差 | O(n) | O(1) |
|
|
680
|
-
| `mean()` | 计算元素均值 | O(n) | O(1) |
|
|
681
|
-
| `mean(mapper)` | 使用映射器计算元素均值 | O(n) | O(1) |
|
|
682
|
-
| `median()` | 计算元素中位数 | O(n) | O(1) |
|
|
683
|
-
| `median(mapper)` | 使用映射器计算元素中位数 | O(n) | O(1) |
|
|
684
|
-
| `mode()` | 计算元素众数 | O(n) | O(1) |
|
|
685
|
-
| `mode(mapper)` | 使用映射器计算元素众数 | O(n) | O(1) |
|
|
686
|
-
| `summate()` | 计算元素总和 | O(n) | O(1) |
|
|
687
|
-
| `summate(mapper)` | 使用映射器计算元素总和 | O(n) | O(1) |
|
|
688
|
-
| `quantile(quantile)` | 计算元素分位数 | O(n) | O(1) |
|
|
689
|
-
| `quantile(quantile, mapper)` | 使用映射器计算元素分位数 | O(n) | O(1) |
|
|
690
|
-
| `interquartileRange()` | 计算元素四分位距 | O(n) | O(1) |
|
|
691
|
-
| `interquartileRange(mapper)` | 使用映射器计算元素四分位距 | O(n) | O(1) |
|
|
692
|
-
| `skewness()` | 计算元素偏度 | O(n) | O(1) |
|
|
693
|
-
| `skewness(mapper)` | 使用映射器计算元素偏度 | O(n) | O(1) |
|
|
694
|
-
| `kurtosis()` | 计算元素峰度 | O(n) | O(1) |
|
|
695
|
-
| `kurtosis(mapper)` | 使用映射器计算元素峰度 | O(n) | O(1) |
|
|
696
|
-
|
|
697
|
-
### Window Collectable 方法
|
|
698
|
-
|
|
699
|
-
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
700
|
-
|------------|------------|------------|------------|
|
|
701
|
-
| `*` | 遍历所有元素 | O(n) | O(1) |
|
|
702
|
-
| `*` | 异步遍历所有元素 | O(n) | O(1) |
|
|
703
|
-
| `slide(size)` | 滑动指定大小的窗口 | O(n) | O(1) |
|
|
704
|
-
| `slide(size, step)` | 滑动指定大小和步长的窗口 | O(n) | O(1) |
|
|
705
|
-
| `tumble(size)` | 滚动指定大小的窗口 | O(n) | O(1) |
|
|
706
|
-
|
|
707
|
-
## 性能选择指南
|
|
708
|
-
|
|
709
|
-
### 选择无序收集器(性能优先)
|
|
710
|
-
```typescript
|
|
711
|
-
// 当不需要顺序保证时,使用无序收集器以获得最佳性能
|
|
712
|
-
let highPerformance = data
|
|
713
|
-
.filter(predicate)
|
|
714
|
-
.map(mapper)
|
|
715
|
-
.toUnoredered(); // 最佳性能
|
|
716
|
-
```
|
|
717
|
-
|
|
718
|
-
### 选择有序收集器(需要顺序)
|
|
719
|
-
```typescript
|
|
720
|
-
// 当需要保持元素顺序时,使用有序收集器
|
|
721
|
-
let ordered = data.sorted(comparator);
|
|
722
|
-
```
|
|
723
|
-
|
|
724
|
-
### 选择窗口收集器(窗口操作)
|
|
725
|
-
```typescript
|
|
726
|
-
// 当需要窗口操作时
|
|
727
|
-
let window: WindowCollectable<number> = data
|
|
728
|
-
.toWindow()
|
|
729
|
-
.slide(5n, 2n); // 滑动窗口
|
|
730
|
-
```
|
|
731
|
-
|
|
732
|
-
### 选择统计分析(数值计算)
|
|
733
|
-
```typescript
|
|
734
|
-
// 当需要统计分析时
|
|
735
|
-
let statistics: NumericStatistics<number> = data
|
|
736
|
-
.toNumericStatistics(); // 数字统计
|
|
737
|
-
|
|
738
|
-
let bigIntStatistics: BigintStatistics<bigint> = data
|
|
739
|
-
.toBigintStatistics(); // 大整数统计
|
|
740
|
-
```
|
|
741
|
-
|
|
742
|
-
https://github.com/eloyhere/semantic-typescript
|
|
743
|
-
https://www.npmjs.com/package/semantic-typescript
|
|
744
|
-
|
|
745
|
-
## 重要说明
|
|
746
|
-
|
|
747
|
-
1. **排序操作的影响**:在有序收集器中,`sorted()` 操作会覆盖 `redirect`、`translate`、`shuffle`、`reverse` 的效果。
|
|
748
|
-
2. **性能考量**:如果不需要顺序保证,优先使用 `toUnoredered()` 以获得更好的性能。
|
|
749
|
-
3. **内存使用**:排序操作需要 O(n) 的额外空间。
|
|
750
|
-
4. **实时数据**:Semantic 流适用于处理实时数据,并支持异步数据源。
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
这个库为 TypeScript 开发者提供了强大而灵活的流式处理能力,结合了函数式编程的优势和类型安全的保证。
|
|
1
|
+
# **Semantic-TypeScript**
|
|
2
|
+
**流,索引化。** 您的数据,尽在掌控。
|
|
3
|
+
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
### 概述
|
|
7
|
+
|
|
8
|
+
Semantic-TypeScript 是流处理技术的一次重大飞跃,它**集大成**了 JavaScript `GeneratorFunction`、Java Streams 和 MySQL 式索引中最有效的概念。其核心理念既简单又强大:通过智能索引而非暴力迭代,来构建高效的数据处理管道。
|
|
9
|
+
|
|
10
|
+
当传统库强制使用同步循环或笨拙的 Promise 链时,Semantic-TypeScript 提供了一种**完全异步**、函数式纯粹且类型安全的体验,专为现代前端开发的需求而设计。
|
|
11
|
+
|
|
12
|
+
在其优雅的模型中,数据仅在上游管道显式调用 `accept`(以及可选的 `interrupt`)回调时才会抵达消费者。您完全掌控时机——就在您需要的时候。
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
### 开发者为何青睐它
|
|
17
|
+
|
|
18
|
+
- **零样板索引** — 每个元素都携带其自然或自定义索引。
|
|
19
|
+
- **函数式纯粹风格** — 具备完整的 TypeScript 类型推断。
|
|
20
|
+
- **防泄漏事件流** — `useWindow`、`useDocument`、`useHTMLElement` 和 `useWebSocket` 在设计时就考虑了安全性。您通过 `limit(n)`、`sub(start, end)` 或 `takeWhile(predicate)` 定义边界,库则负责清理。没有残留的监听器,没有内存泄漏。
|
|
21
|
+
- **开箱即用的统计** — 全面的数值和 bigint 分析,包括平均值、中位数、众数、方差、偏度和峰度。
|
|
22
|
+
- **可预测的性能** — 根据需求在有序和无序收集器之间选择。
|
|
23
|
+
- **内存高效** — 流采用惰性求值,无需担心内存问题。
|
|
24
|
+
- **无未定义行为** — TypeScript 保证类型安全和可空性。除非在回调函数中显式修改,否则输入数据保持不变。
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
### 安装
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
npm install semantic-typescript
|
|
32
|
+
```
|
|
33
|
+
或
|
|
34
|
+
```bash
|
|
35
|
+
yarn add semantic-typescript
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
### 快速开始
|
|
41
|
+
|
|
42
|
+
```typescript
|
|
43
|
+
import { useOf, useFrom, useRange, useWindow, useHTMLElement, useWebSocket, useText, useStringify } from "semantic-typescript";
|
|
44
|
+
|
|
45
|
+
// 数值统计
|
|
46
|
+
let summate: number = useOf(10, 20, 30, 40)
|
|
47
|
+
.map((n: number): number => n * 2)
|
|
48
|
+
.toNumericStatistics() // 终结操作前必需
|
|
49
|
+
.summate(); // 200
|
|
50
|
+
|
|
51
|
+
// Bigint 统计
|
|
52
|
+
let summate: bigint = useOf(10n, 20n, 30n, 40n)
|
|
53
|
+
.map((n: bigint): bigint => n * 2)
|
|
54
|
+
.toBigIntStatistics() // 终结操作前必需
|
|
55
|
+
.summate(); // 200n
|
|
56
|
+
|
|
57
|
+
// 通过索引反转流
|
|
58
|
+
useFrom([1, 2, 3, 4, 5])
|
|
59
|
+
.redirect((element: E, index: bigint): bigint => -index) // 负索引以实现反转
|
|
60
|
+
.toOrdered() // 调用 toOrdered() 以保持索引顺序
|
|
61
|
+
.toArray(); // [5, 4, 3, 2, 1]
|
|
62
|
+
|
|
63
|
+
// 打乱流
|
|
64
|
+
useFrom([1, 2, 3, 4, 5])
|
|
65
|
+
.shuffle()
|
|
66
|
+
.toOrdered()
|
|
67
|
+
.toArray(); // 例如:[2, 5, 1, 4, 3]
|
|
68
|
+
|
|
69
|
+
// 在流内平移元素
|
|
70
|
+
useFrom([1, 2, 3, 4, 5])
|
|
71
|
+
.translate(2) // 将元素向右移动 2 位
|
|
72
|
+
.toOrdered()
|
|
73
|
+
.toArray(); // [4, 5, 1, 2, 3]
|
|
74
|
+
|
|
75
|
+
useFrom([1, 2, 3, 4, 5])
|
|
76
|
+
.translate(-2) // 将元素向左移动 2 位
|
|
77
|
+
.toOrdered()
|
|
78
|
+
.toArray(); // [3, 4, 5, 1, 2]
|
|
79
|
+
|
|
80
|
+
// 无限范围与提前终止
|
|
81
|
+
useRange(0n, 1_000_000n)
|
|
82
|
+
.filter(n => n % 17n === 0n)
|
|
83
|
+
.limit(10n) // 在 10 个元素后停止
|
|
84
|
+
.toUnordered()
|
|
85
|
+
.toArray();
|
|
86
|
+
|
|
87
|
+
// 实时窗口大小调整(5 次事件后自动停止)
|
|
88
|
+
useWindow("resize")
|
|
89
|
+
.limit(5n) // 对事件流至关重要
|
|
90
|
+
.toUnordered()
|
|
91
|
+
.forEach((ev, idx) => console.log(`调整大小 #${idx}`));
|
|
92
|
+
|
|
93
|
+
// 监听 HTML 元素
|
|
94
|
+
// <input id="input" type="text"/>
|
|
95
|
+
useHTMLElement("#input", "change")
|
|
96
|
+
.limit(1)
|
|
97
|
+
.toUnordered()
|
|
98
|
+
.forEach((event: Event) => submit(event));
|
|
99
|
+
|
|
100
|
+
// 监听多个元素和事件
|
|
101
|
+
useHTMLElement("input", ["change", "keyup"])
|
|
102
|
+
.takeWhile((event: Event): boolean => validate(event))
|
|
103
|
+
.toUnordered()
|
|
104
|
+
.forEach((event: Event) => submit(event));
|
|
105
|
+
|
|
106
|
+
// 监听 WebSocket
|
|
107
|
+
let webSocket = new WebSocket("ws://localhost:8080");
|
|
108
|
+
webSocket.addEventListener("close", (): void => {
|
|
109
|
+
webSocket.close(); // 需手动管理 WebSocket 生命周期
|
|
110
|
+
});
|
|
111
|
+
useWebSocket(webSocket, "message")
|
|
112
|
+
.limit(1)
|
|
113
|
+
.toUnordered()
|
|
114
|
+
.forEach((message: MessageEvent) => console.log(message.data));
|
|
115
|
+
|
|
116
|
+
// 按码点迭代字符串
|
|
117
|
+
useText("My emotion now is: 😊, and semantic is 👍")
|
|
118
|
+
.toUnordered()
|
|
119
|
+
.log(); // 输出字符串
|
|
120
|
+
|
|
121
|
+
// 安全地字符串化包含循环引用的对象
|
|
122
|
+
let o = {
|
|
123
|
+
a: 1,
|
|
124
|
+
b: "text",
|
|
125
|
+
c: [o.a, o.b, o.c] // 循环引用
|
|
126
|
+
};
|
|
127
|
+
// let text: string = JSON.stringify(o); // 抛出错误
|
|
128
|
+
let text: string = useStringify(o); // 安全地生成 `{a: 1, b: "text", c: []}`
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
### 核心概念
|
|
134
|
+
|
|
135
|
+
| 概念 | 目的 | 何时使用 |
|
|
136
|
+
| :--- | :--- | :--- |
|
|
137
|
+
| `AsynchronousSemantic` | 用于异步流、事件和惰性管道的核心构建器。 | 实时事件、WebSocket、DOM 监听器、长时间运行或无限流。 |
|
|
138
|
+
| `SynchronousSemantic` | 用于同步、内存中或基于循环的流的构建器。 | 静态数据、范围、立即迭代。 |
|
|
139
|
+
| `toUnordered()` | 最快的终结收集器(基于 Map 的索引)。 | 性能关键路径(O(n) 时间与空间,无排序)。 |
|
|
140
|
+
| `toOrdered()` | 有序的、索引稳定的收集器。 | 当需要稳定排序或索引访问时。 |
|
|
141
|
+
| `toNumericStatistics()` | 丰富的数值统计分析(均值、中位数、方差、偏度、峰度等)。 | 数据分析和统计计算。 |
|
|
142
|
+
| `toBigIntStatistics()` | 丰富的 bigint 统计分析。 | 针对大整数的数据分析和统计计算。 |
|
|
143
|
+
| `toWindow()` | 滑动和滚动窗口支持。 | 时间序列处理、批处理和窗口化操作。 |
|
|
144
|
+
|
|
145
|
+
---
|
|
146
|
+
|
|
147
|
+
**重要使用规则**
|
|
148
|
+
|
|
149
|
+
1. **事件流**(`useWindow`、`useDocument`、`useHTMLElement`、`useWebSocket`……)返回一个 `AsynchronousSemantic`。
|
|
150
|
+
→ 您**必须**调用 `.limit(n)`、`.sub(start, end)` 或 `.takeWhile()` 来停止监听。否则,监听器将保持活动状态。
|
|
151
|
+
|
|
152
|
+
2. **终结操作**(`.toArray()`、`.count()`、`.average()`、`.reduce()`、`.findFirst()` 等)**仅在**转换为收集器**之后**可用:
|
|
153
|
+
```typescript
|
|
154
|
+
.toUnordered() // O(n) 时间与空间,无排序
|
|
155
|
+
// 或
|
|
156
|
+
.toOrdered() // 已排序,保持顺序
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
### 性能特征
|
|
162
|
+
|
|
163
|
+
| 收集器 | 时间复杂度 | 空间复杂度 | 是否排序? | 最佳适用场景 |
|
|
164
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
165
|
+
| `toUnordered()` | O(n) | O(n) | 否 | 追求原始速度,顺序不重要时。 |
|
|
166
|
+
| `toOrdered()` | O(2n) | O(n) | 是 | 需要稳定排序、索引访问或分析时。 |
|
|
167
|
+
| `toNumericStatistics()` | O(2n) | O(n) | 是 | 需要排序数据的统计操作。 |
|
|
168
|
+
| `toBigIntStatistics()` | O(2n) | O(n) | 是 | 针对 bigint 的统计操作。 |
|
|
169
|
+
| `toWindow()` | O(2n) | O(n) | 是 | 基于时间的窗口化操作。 |
|
|
170
|
+
|
|
171
|
+
当速度至上时,选择 `toUnordered()`。仅当您需要稳定排序或依赖于排序数据的统计方法时,才使用 `toOrdered()`。
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
**与其他前端流处理器的对比**
|
|
176
|
+
|
|
177
|
+
| 特性 | Semantic-TypeScript | RxJS | 原生 Async Iterators / Generators | Most.js |
|
|
178
|
+
| :--- | :--- | :--- | :--- | :--- |
|
|
179
|
+
| **TypeScript 集成** | 一流的深度类型支持,具备原生索引感知。 | 优秀,但涉及复杂的泛型。 | 良好,需要手动类型标注。 | 强大,函数式优先风格。 |
|
|
180
|
+
| **内置统计分析** | 对 `number` 和 `bigint` 的全面原生支持。 | 非原生支持(需要自定义操作符)。 | 无。 | 无。 |
|
|
181
|
+
| **索引与位置感知** | 原生、强大的每个元素 bigint 索引。 | 需要自定义操作符(`scan`、`withLatestFrom`)。 | 需要手动计数器。 | 基础,无内置索引。 |
|
|
182
|
+
| **事件流管理** | 专用的、类型安全的工厂函数,具备显式的提前停止控制。 | 强大但需要手动管理订阅。 | 手动事件监听器 + 取消。 | 良好的 `fromEvent`,轻量。 |
|
|
183
|
+
| **性能与内存效率** | 卓越——优化的 `toUnordered()` 和 `toOrdered()` 收集器。 | 非常好,但操作符链会带来开销。 | 优秀(零开销)。 | 优秀。 |
|
|
184
|
+
| **包体积** | 非常轻量。 | 较大(即使进行 Tree Shaking)。 | 零(原生)。 | 小。 |
|
|
185
|
+
| **API 设计理念** | 函数式收集器模式,具有显式索引。 | 响应式 Observable 模式。 | 迭代器 / 生成器模式。 | 函数式,无点风格。 |
|
|
186
|
+
| **提前终止与控制** | 显式(`interrupt`、`.limit()`、`.takeWhile()`、`.sub()`)。 | 良好(`take`、`takeUntil`、`first`)。 | 手动(在 `for await…of` 中使用 `break`)。 | 良好(`take`、`until`)。 |
|
|
187
|
+
| **同步与异步支持** | 统一的 API——对两者都提供一流支持。 | 主要是异步。 | 两者都支持,但需手动处理。 | 主要是异步。 |
|
|
188
|
+
| **学习曲线** | 对于熟悉函数式和索引管道的开发者来说很平缓。 | 较陡峭(众多操作符、热/冷 Observable)。 | 低。 | 中等。 |
|
|
189
|
+
|
|
190
|
+
**Semantic-TypeScript 的主要优势**
|
|
191
|
+
|
|
192
|
+
* 独特的内置统计和索引功能,无需手动 `reduce` 或外部库。
|
|
193
|
+
* 对事件流的显式控制,防止了 RxJS 中常见的内存泄漏。
|
|
194
|
+
* 统一的同步/异步设计,为多样化的用例提供了单一、一致的 API。
|
|
195
|
+
|
|
196
|
+
此对比说明了为何 Semantic-TypeScript 特别适合那些需要高性能、类型安全和丰富分析功能,而又不希望陷入传统响应式库繁琐仪式感的现代 TypeScript 前端应用。
|
|
197
|
+
|
|
198
|
+
---
|
|
199
|
+
|
|
200
|
+
### 准备探索?
|
|
201
|
+
|
|
202
|
+
Semantic-TypeScript 将复杂的数据流转化为可读、可组合且高性能的管道。无论您是处理实时 UI 事件、处理大型数据集还是构建分析仪表板,它都能提供数据库级索引的强大功能与函数式编程的优雅。
|
|
203
|
+
|
|
204
|
+
**下一步:**
|
|
205
|
+
|
|
206
|
+
* 在您的 IDE 中浏览完整的类型化 API(所有导出均来自主包)。
|
|
207
|
+
* 加入不断壮大的开发者社区,他们已用清晰的 Semantic 管道取代了复杂的异步迭代器。
|
|
208
|
+
|
|
209
|
+
**Semantic-TypeScript** — 流与结构的交汇点。
|
|
210
|
+
|
|
211
|
+
立即开始构建,体验精心设计的索引所带来的不同。
|
|
212
|
+
|
|
213
|
+
**构建清晰,运行自信,让数据流转尽在掌控。**
|