semantic-typescript 0.3.8 → 0.5.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/collectable.d.ts +119 -1
- package/dist/collectable.js +624 -21
- package/dist/collector.d.ts +94 -50
- package/dist/collector.js +128 -110
- package/dist/factory.d.ts +23 -35
- package/dist/factory.js +162 -68
- package/dist/guard.d.ts +43 -28
- package/dist/guard.js +144 -65
- package/dist/hash.d.ts +13 -0
- package/dist/hash.js +205 -0
- package/dist/hook.d.ts +16 -4
- package/dist/hook.js +19 -15
- package/dist/index.d.ts +1 -2
- package/dist/index.js +1 -2
- package/dist/map.d.ts +76 -0
- package/dist/map.js +253 -0
- package/dist/node.d.ts +182 -0
- package/dist/node.js +918 -0
- package/dist/optional.d.ts +3 -0
- package/dist/optional.js +26 -23
- package/dist/semantic.d.ts +1 -3
- package/dist/semantic.js +43 -50
- package/dist/set.d.ts +19 -0
- package/dist/set.js +65 -0
- package/dist/statistics.js +21 -15
- package/dist/symbol.d.ts +14 -0
- package/dist/symbol.js +14 -0
- package/dist/tree.d.ts +82 -0
- package/dist/tree.js +257 -0
- package/dist/utility.d.ts +8 -1
- package/dist/utility.js +9 -0
- package/dist/window.js +7 -5
- package/package.json +1 -5
- package/readme.cn.md +381 -636
- package/readme.md +3 -1
package/readme.cn.md
CHANGED
|
@@ -1,60 +1,60 @@
|
|
|
1
1
|
# Semantic-TypeScript 流处理库
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## 介绍
|
|
4
4
|
|
|
5
|
-
**Semantic-TypeScript
|
|
5
|
+
**Semantic-TypeScript:面向现代网络开发的范式转移流处理库**
|
|
6
6
|
|
|
7
|
-
Semantic-TypeScript
|
|
7
|
+
Semantic-TypeScript 代表了流处理技术的一项重大进步,它融合了来自 JavaScript GeneratorFunction、Java Stream 和 MySQL 索引范式中最有效的概念。其基础设计原则围绕通过复杂的数据索引方法构建异常高效的数据处理流水线。该库专门为现代前端开发提供了一个严格类型安全、函数式纯正的流式操作体验。
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
与传统的同步处理架构相比,Semantic-TypeScript 实现了完全异步的处理模型。在数据流生成期间,数据在终端接收的时间完全由上流的 `accept` 和 `interrupt` 回调机制调用决定。这种深思熟虑的架构选择使该库能够优雅地处理:
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
11
|
+
* **具有确定性延迟特性的实时数据流**
|
|
12
|
+
* **通过内存高效的处理流水线处理大规模数据集**
|
|
13
|
+
* **具有一致性和可靠性保证的异步数据源**
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
该库的创新方法从根本上重新构想了开发者与流数据的交互方式,在一个单一、连贯的包中提供了前所未有的性能和开发者人体工程学特性。
|
|
16
16
|
|
|
17
|
-
###
|
|
17
|
+
### 为什么选择 Semantic-TypeScript?
|
|
18
18
|
|
|
19
|
-
在 TypeScript 项目中选择合适的数据流处理库需要在性能、开发者体验和架构契合度之间取得平衡。Semantic-TypeScript
|
|
19
|
+
在 TypeScript 项目中选择合适的数据流处理库需要在性能、开发者体验和架构契合度之间取得平衡。Semantic-TypeScript 旨在在所有维度上都表现出色,为现代网络提供了一种范式转移的方法。以下为其脱颖而出之处:
|
|
20
20
|
|
|
21
|
-
#### 1.
|
|
22
|
-
Semantic-TypeScript
|
|
21
|
+
#### 1. **统一的、类型安全的流式范式**
|
|
22
|
+
Semantic-TypeScript 融合了**JavaScript GeneratorFunctions**、**Java Streams API** 和**数据库索引策略**中最有效的概念。它为处理任何数据序列(无论是静态数组、实时事件还是异步块)提供了一致的声明式 API,同时利用 TypeScript 的全部功能确保端到端的类型安全。这消除了一整类运行时错误,并将流操作转变为可预测的、编译器验证的活动。
|
|
23
23
|
|
|
24
|
-
#### 2.
|
|
25
|
-
|
|
24
|
+
#### 2. **智能惰性求值带来的不妥协性能**
|
|
25
|
+
其核心建立在**惰性求值**之上。像 `filter`、`map` 和 `flatMap` 这样的操作仅仅组合了一个处理流水线;直到终端操作(如 `collect` 或 `toArray`)被调用时才会进行实际工作。这与**短路**能力(通过 `limit`、`anyMatch` 或自定义的 `interruptor` 函数等操作)相结合,允许在处理结果已知时提前停止,从而显著提高处理大规模或无限流的效率。
|
|
26
26
|
|
|
27
|
-
#### 3.
|
|
28
|
-
|
|
29
|
-
* **`Semantic<E
|
|
30
|
-
* **`Collectable<E
|
|
27
|
+
#### 3. **架构区分:`Semantic<E>` 与 `Collectable<E>`**
|
|
28
|
+
该库引入了一个其他库通常缺乏的关键架构分离:
|
|
29
|
+
* **`Semantic<E>`**:表示抽象的、惰性的流定义——数据转换的“蓝图”。它是不可变且可组合的。
|
|
30
|
+
* **`Collectable<E>`**:表示一个物化的、可执行的流视图,提供所有终端操作。
|
|
31
31
|
|
|
32
|
-
|
|
32
|
+
这种分离强制了清晰的心智模型,并允许进行优化(例如,如果顺序不重要,`UnorderedCollectable` 可以跳过昂贵的排序步骤)。
|
|
33
33
|
|
|
34
|
-
#### 4.
|
|
35
|
-
|
|
34
|
+
#### 4. **`Collector<E, A, R>` 模式的强大威力**
|
|
35
|
+
受 Java 启发,`Collector` 模式是灵活性的引擎。它将*如何累加*流元素的*规范*与流本身的*执行*解耦。库提供了一组丰富的内置收集器(`useToArray`、`useGroupBy`、`useSummate` 等)用于日常任务,同时该模式让实现您自己复杂的、可重用的归约逻辑变得简单。这比一组固定的终端方法要强大得多,也更具可组合性。
|
|
36
36
|
|
|
37
|
-
#### 5.
|
|
38
|
-
Semantic-TypeScript
|
|
37
|
+
#### 5. **对现代网络和异步数据的一流支持**
|
|
38
|
+
Semantic-TypeScript 专为现代前端和 Node.js 开发而设计。它为现代网络源提供了原生的工厂方法:
|
|
39
39
|
* `from(iterable)`、`range()` 用于静态数据。
|
|
40
40
|
* `interval()`、`animationFrame()` 用于基于时间的流。
|
|
41
41
|
* `blob()` 用于分块二进制数据处理。
|
|
42
42
|
* `websocket()` 用于实时消息流。
|
|
43
|
-
它对 `Iterable` 和 `AsyncIterable`
|
|
43
|
+
它对 `Iterable` 和 `AsyncIterable` 协议的基础支持意味着它用相同的优雅 API 处理同步和异步数据流。
|
|
44
44
|
|
|
45
|
-
#### 6.
|
|
46
|
-
|
|
45
|
+
#### 6. **超越基本聚合:内置统计分析**
|
|
46
|
+
超越简单的求和与平均值。该库提供了专门的 `NumericStatistics` 和 `BigIntStatistics` 类,可以直接从您的流中即时访问高级统计指标——**方差、标准差、中位数、分位数、偏度、峰度**。这使复杂的数据分析变成一行代码,省去了手动实现或集成另一个专门库的麻烦。
|
|
47
47
|
|
|
48
|
-
#### 7.
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
* **`Optional<T>`
|
|
52
|
-
*
|
|
48
|
+
#### 7. **为开发者人体工程学而设计**
|
|
49
|
+
* **流畅、可链式调用的 API**:将复杂的数据流水线编写为可读的、顺序的操作链。
|
|
50
|
+
* **全面的实用工具套件**:开箱即用,包含必要的守卫(`isOptional`、`isSemantic`)、类型安全的实用程序(`useCompare`、`useTraverse`)和函数式接口。
|
|
51
|
+
* **`Optional<T>` 集成**:安全地建模值的缺失,消除查找操作中的空指针问题。
|
|
52
|
+
* **性能指南**:文档清晰地指导您何时使用 `toUnordered()`(追求最大速度)与 `toOrdered()`(当顺序重要时)。
|
|
53
53
|
|
|
54
|
-
#### 8.
|
|
55
|
-
作为一个托管在 **GitHub** 上并通过 **npm**
|
|
54
|
+
#### 8. **健壮、面向社区的基础**
|
|
55
|
+
作为一个托管在 **GitHub** 上并通过 **npm** 分发的开源库,它专为实际应用而构建。详尽的文档,附带时间和空间复杂度注解及实际示例,降低了学习曲线,并为性能敏感的应用提供了清晰性。
|
|
56
56
|
|
|
57
|
-
|
|
57
|
+
**总而言之,如果您寻求一个严格设计、类型安全且高性能的流处理库,它将企业级数据转换模式的力量带入 TypeScript 生态系统,同时又不妥协于现代网络开发的惯用语法和需求,请选择 Semantic-TypeScript。**
|
|
58
58
|
|
|
59
59
|
## 安装
|
|
60
60
|
|
|
@@ -66,42 +66,42 @@ npm install semantic-typescript
|
|
|
66
66
|
|
|
67
67
|
| 类型 | 描述 |
|
|
68
68
|
|------|-------------|
|
|
69
|
-
| `Invalid<T>` |
|
|
69
|
+
| `Invalid<T>` | 继承自 `null` 或 `undefined` 的类型 |
|
|
70
70
|
| `Valid<T>` | 排除 `null` 和 `undefined` 的类型 |
|
|
71
71
|
| `MaybeInvalid<T>` | 可能为 `null` 或 `undefined` 的类型 |
|
|
72
72
|
| `Primitive` | 原始类型的集合 |
|
|
73
73
|
| `MaybePrimitive<T>` | 可能是原始类型的类型 |
|
|
74
|
-
| `OptionalSymbol` | `Optional`
|
|
75
|
-
| `SemanticSymbol` | `Semantic`
|
|
76
|
-
| `CollectorsSymbol` | `Collector`
|
|
77
|
-
| `CollectableSymbol` | `Collectable`
|
|
78
|
-
| `OrderedCollectableSymbol` | `OrderedCollectable`
|
|
79
|
-
| `WindowCollectableSymbol` | `WindowCollectable`
|
|
80
|
-
| `StatisticsSymbol` | `Statistics`
|
|
81
|
-
| `NumericStatisticsSymbol` | `NumericStatistics`
|
|
82
|
-
| `BigIntStatisticsSymbol` | `BigIntStatistics`
|
|
83
|
-
| `UnorderedCollectableSymbol` | `UnorderedCollectable`
|
|
74
|
+
| `OptionalSymbol` | `Optional` 类的 Symbol 标识符 |
|
|
75
|
+
| `SemanticSymbol` | `Semantic` 类的 Symbol 标识符 |
|
|
76
|
+
| `CollectorsSymbol` | `Collector` 类的 Symbol 标识符 |
|
|
77
|
+
| `CollectableSymbol` | `Collectable` 类的 Symbol 标识符 |
|
|
78
|
+
| `OrderedCollectableSymbol` | `OrderedCollectable` 类的 Symbol 标识符 |
|
|
79
|
+
| `WindowCollectableSymbol` | `WindowCollectable` 类的 Symbol 标识符 |
|
|
80
|
+
| `StatisticsSymbol` | `Statistics` 类的 Symbol 标识符 |
|
|
81
|
+
| `NumericStatisticsSymbol` | `NumericStatistics` 类的 Symbol 标识符 |
|
|
82
|
+
| `BigIntStatisticsSymbol` | `BigIntStatistics` 类的 Symbol 标识符 |
|
|
83
|
+
| `UnorderedCollectableSymbol` | `UnorderedCollectable` 类的 Symbol 标识符 |
|
|
84
84
|
|
|
85
85
|
## 函数式接口
|
|
86
86
|
|
|
87
87
|
| 接口 | 描述 |
|
|
88
88
|
|-----------|-------------|
|
|
89
|
-
| `Runnable` |
|
|
90
|
-
| `Supplier<R>` |
|
|
89
|
+
| `Runnable` | 无参数无返回值的函数 |
|
|
90
|
+
| `Supplier<R>` | 无参数并返回 `R` 的函数 |
|
|
91
91
|
| `Functional<T, R>` | 单参数转换函数 |
|
|
92
92
|
| `BiFunctional<T, U, R>` | 双参数转换函数 |
|
|
93
93
|
| `TriFunctional<T, U, V, R>` | 三参数转换函数 |
|
|
94
|
-
| `Predicate<T>` |
|
|
95
|
-
| `BiPredicate<T, U>` |
|
|
96
|
-
| `TriPredicate<T, U, V>` |
|
|
97
|
-
| `Consumer<T>` |
|
|
98
|
-
| `BiConsumer<T, U>` |
|
|
99
|
-
| `TriConsumer<T, U, V>` |
|
|
94
|
+
| `Predicate<T>` | 单参数谓词函数 |
|
|
95
|
+
| `BiPredicate<T, U>` | 双参数谓词函数 |
|
|
96
|
+
| `TriPredicate<T, U, V>` | 三参数谓词函数 |
|
|
97
|
+
| `Consumer<T>` | 单参数消费者函数 |
|
|
98
|
+
| `BiConsumer<T, U>` | 双参数消费者函数 |
|
|
99
|
+
| `TriConsumer<T, U, V>` | 三参数消费者函数 |
|
|
100
100
|
| `Comparator<T>` | 双参数比较函数 |
|
|
101
101
|
| `Generator<T>` | 生成器函数(核心与基础) |
|
|
102
102
|
|
|
103
103
|
```typescript
|
|
104
|
-
//
|
|
104
|
+
// 类型使用示例
|
|
105
105
|
let predicate: Predicate<number> = (n: number): boolean => n > 0;
|
|
106
106
|
let mapper: Functional<string, number> = (text: string): number => text.length;
|
|
107
107
|
let comparator: Comparator<number> = (a: number, b: number): number => a - b;
|
|
@@ -134,16 +134,15 @@ let comparator: Comparator<number> = (a: number, b: number): number => a - b;
|
|
|
134
134
|
| `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | 检查是否为 BigIntStatistics 实例 | O(1) | O(1) |
|
|
135
135
|
| `isPromise(t: unknown): t is Promise<unknown>` | 检查是否为 Promise 对象 | O(1) | O(1) |
|
|
136
136
|
| `isAsyncFunction(t: unknown): t is AsyncFunction` | 检查是否为 AsyncFunction | O(1) | O(1) |
|
|
137
|
-
| `isGenerator(t: unknown): t is Generator<unknown>` | 检查是否为 Generator | O(1) | O(1) |
|
|
138
137
|
| `isGeneratorFunction(t: unknown): t is GeneratorFunction` | 检查是否为 GeneratorFunction | O(1) | O(1) |
|
|
139
138
|
| `isAsyncGeneratorFunction(t: unknown): t is AsyncGeneratorFunction` | 检查是否为 AsyncGeneratorFunction | O(1) | O(1) |
|
|
140
139
|
|
|
141
140
|
```typescript
|
|
142
|
-
//
|
|
141
|
+
// 类型守卫使用示例
|
|
143
142
|
let value: unknown = "hello";
|
|
144
143
|
|
|
145
144
|
if (isString(value)) {
|
|
146
|
-
console.log(value.length); // 类型安全,value
|
|
145
|
+
console.log(value.length); // 类型安全,value 被推断为 string
|
|
147
146
|
}
|
|
148
147
|
|
|
149
148
|
if (isOptional(someValue)) {
|
|
@@ -151,25 +150,25 @@ if (isOptional(someValue)) {
|
|
|
151
150
|
}
|
|
152
151
|
|
|
153
152
|
if(isIterable(value)){
|
|
154
|
-
//
|
|
153
|
+
// 类型安全,现在它是一个可迭代对象
|
|
155
154
|
for(let item of value){
|
|
156
155
|
console.log(item);
|
|
157
156
|
}
|
|
158
157
|
}
|
|
159
158
|
```
|
|
160
159
|
|
|
161
|
-
##
|
|
160
|
+
## 工具函数
|
|
162
161
|
|
|
163
162
|
| 函数 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
164
163
|
|------|------|------------|------------|
|
|
165
164
|
| `useCompare<T>(t1: T, t2: T): number` | 通用比较函数 | O(1) | O(1) |
|
|
166
165
|
| `useRandom<T = number \| bigint>(index: T): T` | 伪随机数生成器 | O(log n) | O(1) |
|
|
167
|
-
| `useTraverse(t, callback
|
|
166
|
+
| `useTraverse(t, callback)` | 深度遍历对象,不处理循环引用 | O(n) | O(1) |
|
|
168
167
|
| `useToNumber(t: unknown): number` | 将值转换为数字 | O(1) | O(1) |
|
|
169
168
|
| `useToBigInt(t: unknown): bigint` | 将值转换为 BigInt | O(1) | O(1) |
|
|
170
169
|
|
|
171
170
|
```typescript
|
|
172
|
-
//
|
|
171
|
+
// 工具函数使用示例
|
|
173
172
|
let numbers: Array<number> = [3, 1, 4, 1, 5];
|
|
174
173
|
numbers.sort(useCompare); // [1, 1, 3, 4, 5]
|
|
175
174
|
|
|
@@ -191,9 +190,9 @@ useTraverse(o, (value, key): boolean => {
|
|
|
191
190
|
a 1
|
|
192
191
|
c 2
|
|
193
192
|
1 3 5
|
|
194
|
-
|
|
193
|
+
循环引用、undefined 和 null 值不会被遍历。
|
|
195
194
|
*/
|
|
196
|
-
return true; // 返回 true
|
|
195
|
+
return true; // 返回 true 以继续遍历
|
|
197
196
|
});
|
|
198
197
|
|
|
199
198
|
let toBeResolved: object = {
|
|
@@ -209,13 +208,13 @@ let resolvedBigInt: bigint = useToBigInt(toBeResolved); // 5n
|
|
|
209
208
|
|
|
210
209
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
211
210
|
|------|------|------------|------------|
|
|
212
|
-
| `Optional.empty<T>()
|
|
213
|
-
| `Optional.of<T>(value)
|
|
214
|
-
| `Optional.ofNullable<T>(value)
|
|
215
|
-
| `Optional.ofNonNull<T>(value)
|
|
211
|
+
| `Optional.empty<T>()` | 创建一个空的 Optional | O(1) | O(1) |
|
|
212
|
+
| `Optional.of<T>(value)` | 创建一个包含值的 Optional | O(1) | O(1) |
|
|
213
|
+
| `Optional.ofNullable<T>(value)` | 创建一个可能为空的 Optional | O(1) | O(1) |
|
|
214
|
+
| `Optional.ofNonNull<T>(value)` | 创建一个非 null 的 Optional | O(1) | O(1) |
|
|
216
215
|
|
|
217
216
|
```typescript
|
|
218
|
-
// Optional
|
|
217
|
+
// Optional 使用示例
|
|
219
218
|
let empty: Optional<number> = Optional.empty();
|
|
220
219
|
let present: Optional<number> = Optional.of(42);
|
|
221
220
|
let nullable: Optional<string> = Optional.ofNullable<string>(null);
|
|
@@ -229,93 +228,76 @@ console.log(empty.get(100)); // 输出 100
|
|
|
229
228
|
|
|
230
229
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
231
230
|
|------|------|------------|------------|
|
|
232
|
-
| `Collector.full(identity
|
|
233
|
-
| `Collector.
|
|
234
|
-
| `
|
|
235
|
-
| `
|
|
236
|
-
| `
|
|
237
|
-
| `
|
|
238
|
-
| `
|
|
239
|
-
| `
|
|
240
|
-
| `
|
|
241
|
-
| `
|
|
242
|
-
| `
|
|
243
|
-
| `
|
|
244
|
-
| `
|
|
245
|
-
| `
|
|
246
|
-
| `
|
|
247
|
-
| `
|
|
248
|
-
| `
|
|
249
|
-
| `
|
|
250
|
-
| `
|
|
251
|
-
| `
|
|
252
|
-
| `
|
|
253
|
-
| `
|
|
254
|
-
| `
|
|
255
|
-
| `
|
|
256
|
-
| `
|
|
257
|
-
| `
|
|
258
|
-
| `
|
|
259
|
-
| `
|
|
260
|
-
| `
|
|
261
|
-
| `
|
|
262
|
-
| `
|
|
263
|
-
| `
|
|
264
|
-
| `
|
|
265
|
-
| `
|
|
266
|
-
| `
|
|
267
|
-
| `
|
|
268
|
-
| `
|
|
269
|
-
| `
|
|
270
|
-
| `
|
|
271
|
-
| `
|
|
272
|
-
| `
|
|
273
|
-
| `
|
|
274
|
-
| `
|
|
275
|
-
| `
|
|
276
|
-
| `
|
|
277
|
-
| `
|
|
278
|
-
| `
|
|
279
|
-
| `
|
|
280
|
-
| `
|
|
281
|
-
| `
|
|
282
|
-
| `
|
|
283
|
-
| `
|
|
284
|
-
| `
|
|
285
|
-
| `
|
|
286
|
-
| `
|
|
287
|
-
| `
|
|
288
|
-
| `
|
|
289
|
-
| `
|
|
290
|
-
| `
|
|
291
|
-
| `
|
|
292
|
-
| `
|
|
293
|
-
| `
|
|
294
|
-
| `
|
|
295
|
-
| `
|
|
296
|
-
| `
|
|
297
|
-
| `
|
|
298
|
-
| `
|
|
299
|
-
| `
|
|
300
|
-
| `
|
|
301
|
-
| `
|
|
302
|
-
| `useNumericMode<E>(mapper: Functional<E, number>): Collector<E, Map<number, bigint>, number>` | 创建一个查找映射值数字众数的收集器 | `mapper: Functional<E, number>` | `Collector<E, Map<number, bigint>, number>` |
|
|
303
|
-
| `useBigIntMode<E>(): Collector<E, Map<bigint, bigint>, bigint>` | 创建一个查找 bigint 众数的收集器 | 无 | `Collector<bigint, Map<bigint, bigint>, bigint>` 或 `Collector<E, Map<bigint, bigint>, bigint>` |
|
|
304
|
-
| `useBigIntMode<E>(mapper: Functional<E, bigint>): Collector<E, Map<bigint, bigint>, bigint>` | 创建一个查找映射值 bigint 众数的收集器 | `mapper: Functional<E, bigint>` | `Collector<E, Map<bigint, bigint>, bigint>` |
|
|
305
|
-
| `useNumericVariance<E>(): Collector<E, VarianceAccumulator, number>` | 创建一个计算数字方差的收集器 | 无 | `Collector<number, VarianceAccumulator, number>` 或 `Collector<E, VarianceAccumulator, number>` |
|
|
306
|
-
| `useNumericVariance<E>(mapper: Functional<E, number>): Collector<E, VarianceAccumulator, number>` | 创建一个计算映射值数字方差的收集器 | `mapper: Functional<E, number>` | `Collector<E, VarianceAccumulator, number>` |
|
|
307
|
-
| `useBigIntVariance<E>(): Collector<E, BigIntVarianceAccumulator, bigint>` | 创建一个计算 bigint 方差的收集器 | 无 | `Collector<bigint, BigIntVarianceAccumulator, bigint>` 或 `Collector<E, BigIntVarianceAccumulator, bigint>` |
|
|
308
|
-
| `useBigIntVariance<E>(mapper: Functional<E, bigint>): Collector<E, BigIntVarianceAccumulator, bigint>` | 创建一个计算映射值 bigint 方差的收集器 | `mapper: Functional<E, bigint>` | `Collector<E, BigIntVarianceAccumulator, bigint>` |
|
|
309
|
-
| `useNumericStandardDeviation<E>(): Collector<E, StandardDeviationAccumulator, number>` | 创建一个计算数字标准差的收集器 | 无 | `Collector<number, StandardDeviationAccumulator, number>` 或 `Collector<E, StandardDeviationAccumulator, number>` |
|
|
310
|
-
| `useNumericStandardDeviation<E>(mapper: Functional<E, number>): Collector<E, StandardDeviationAccumulator, number>` | 创建一个计算映射值数字标准差的收集器 | `mapper: Functional<E, number>` | `Collector<E, StandardDeviationAccumulator, number>` |
|
|
311
|
-
| `useBigIntStandardDeviation<E>(): Collector<E, BigIntStandardDeviationAccumulator, bigint>` | 创建一个计算 bigint 标准差的收集器 | 无 | `Collector<bigint, BigIntStandardDeviationAccumulator, bigint>` 或 `Collector<E, BigIntStandardDeviationAccumulator, bigint>` |
|
|
312
|
-
| `useBigIntStandardDeviation<E>(mapper: Functional<E, bigint>): Collector<E, BigIntStandardDeviationAccumulator, bigint>` | 创建一个计算映射值 bigint 标准差的收集器 | `mapper: Functional<E, bigint>` | `Collector<E, BigIntStandardDeviationAccumulator, bigint>` |
|
|
313
|
-
| `useNumericMedian<E>(): Collector<E, number[], number>` | 创建一个计算数字中位数的收集器 | 无 | `Collector<number, number[], number>` 或 `Collector<E, number[], number>` |
|
|
314
|
-
| `useNumericMedian<E>(mapper: Functional<E, number>): Collector<E, number[], number>` | 创建一个计算映射值数字中位数的收集器 | `mapper: Functional<E, number>` | `Collector<E, number[], number>` |
|
|
315
|
-
| `useBigIntMedian<E>(): Collector<E, bigint[], bigint>` | 创建一个计算 bigint 中位数的收集器 | 无 | `Collector<bigint, bigint[], bigint>` 或 `Collector<E, bigint[], bigint>` |
|
|
316
|
-
| `useBigIntMedian<E>(mapper: Functional<E, bigint>): Collector<E, bigint[], bigint>` | 创建一个计算映射值 bigint 中位数的收集器 | `mapper: Functional<E, bigint>` | `Collector<E, bigint[], bigint>` |
|
|
317
|
-
| `useToGeneratorFunction<E>(): Collector<E, Array<E>, globalThis.Generator<E, void, undefined>>` | 创建一个将元素转换为生成器函数的收集器 | 无 | `Collector<E, Array<E>, globalThis.Generator<E, void, undefined>>` |
|
|
318
|
-
| `useToAsyncGeneratorFunction<E>(): Collector<E, Array<E>, globalThis.AsyncGenerator<E, void, undefined>>` | 创建一个将元素转换为异步生成器函数的收集器 | 无 | `Collector<E, Array<E>, globalThis.AsyncGenerator<E, void, undefined>>` |
|
|
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) |
|
|
319
301
|
|
|
320
302
|
```typescript
|
|
321
303
|
// 收集器转换示例
|
|
@@ -324,21 +306,21 @@ let numbers: Semantic<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
|
|
|
324
306
|
// 性能优先:使用无序收集器
|
|
325
307
|
let unordered: UnorderedCollectable<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5])
|
|
326
308
|
.filter((n: number): boolean => n > 3)
|
|
327
|
-
.
|
|
309
|
+
.toUnoredered();
|
|
328
310
|
|
|
329
311
|
// 需要排序:使用有序收集器
|
|
330
312
|
let ordered: OrderedCollectable<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5])
|
|
331
313
|
.sorted();
|
|
332
314
|
|
|
333
|
-
//
|
|
315
|
+
// 统计元素数量
|
|
334
316
|
let count: Collector<number, number, number> = useCount();
|
|
335
|
-
count.collect(from([1,2,3,4,5])); //
|
|
336
|
-
count.collect([1,2,3,4,5]); //
|
|
317
|
+
count.collect(from([1,2,3,4,5])); // 从流中统计
|
|
318
|
+
count.collect([1,2,3,4,5]); // 从可迭代对象中统计
|
|
337
319
|
|
|
338
320
|
// 查找第一个元素
|
|
339
321
|
let findFirst: Collector<number, number, number> = useFindFirst();
|
|
340
|
-
find.collect(from([1,2,3,4,5])); //
|
|
341
|
-
find.collect([1,2,3,4,5]); //
|
|
322
|
+
find.collect(from([1,2,3,4,5])); // 从流中查找第一个元素
|
|
323
|
+
find.collect([1,2,3,4,5]); // 从可迭代对象中查找第一个元素
|
|
342
324
|
|
|
343
325
|
// 计算元素总和
|
|
344
326
|
let summate: Collector<number, number, number> = useSummate();
|
|
@@ -347,51 +329,39 @@ summate.collect([1,2,3,4,5]); // 从可迭代对象中求和
|
|
|
347
329
|
|
|
348
330
|
// 计算元素平均值
|
|
349
331
|
let average: Collector<number, number, number> = useNumericAverage();
|
|
350
|
-
average.collect(from([1,2,3,4,5])); //
|
|
351
|
-
average.collect([1,2,3,4,5]); //
|
|
332
|
+
average.collect(from([1,2,3,4,5])); // 从流中求平均
|
|
333
|
+
average.collect([1,2,3,4,5]); // 从可迭代对象中求平均
|
|
352
334
|
```
|
|
353
335
|
|
|
354
336
|
## Collector 类方法
|
|
355
337
|
|
|
356
338
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
357
|
-
|
|
358
|
-
| `collect(
|
|
359
|
-
| `collect(iterable
|
|
360
|
-
| `collect(
|
|
361
|
-
| `collect(
|
|
362
|
-
| `collect(
|
|
363
|
-
| `collect(start
|
|
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) |
|
|
364
346
|
|
|
365
347
|
### Semantic 工厂方法
|
|
366
348
|
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
|
370
|
-
|
|
371
|
-
| `
|
|
372
|
-
| `
|
|
373
|
-
| `
|
|
374
|
-
| `
|
|
375
|
-
| `
|
|
376
|
-
| `
|
|
377
|
-
| `
|
|
378
|
-
| `
|
|
379
|
-
| `
|
|
380
|
-
| `from<E>(iterable: AsyncIterable<E>): Semantic<E>` | 从异步可迭代对象创建语义流 | `iterable: AsyncIterable<E>` | `Semantic<E>` |
|
|
381
|
-
| `generate<E>(supplier: Supplier<E>, count: bigint): Semantic<E>` | 创建一个生成固定数量值的语义流 | `supplier: Supplier<E>`, `count: bigint` | `Semantic<E>` |
|
|
382
|
-
| `generate<E>(element: E, count: bigint): Semantic<E>` | 创建一个重复一个元素的语义流 | `element: E`, `count: bigint` | `Semantic<E>` |
|
|
383
|
-
| `generate<E>(supplier: Supplier<E>, interrupt: Predicate<E>): Semantic<E>` | 创建一个生成直到满足条件的语义流 | `supplier: Supplier<E>`, `interrupt: Predicate<E>` | `Semantic<E>` |
|
|
384
|
-
| `generate<E>(supplier: Supplier<E>, interrupt: BiPredicate<E, bigint>): Semantic<E>` | 创建一个生成直到满足条件的语义流 | `supplier: Supplier<E>`, `interrupt: BiPredicate<E, bigint>` | `Semantic<E>` |
|
|
385
|
-
| `interval(period: number): Semantic<number>` | 创建一个以固定间隔发出的语义流 | `period: number` | `Semantic<number>` |
|
|
386
|
-
| `interval(period: number, delay: number): Semantic<number>` | 创建一个具有初始延迟的以固定间隔发出的语义流 | `period: number`, `delay: number` | `Semantic<number>` |
|
|
387
|
-
| `iterate<E>(generator: Generator<E>): Semantic<E>` | 从生成器函数创建语义流 | `generator: Generator<E>` | `Semantic<E>` |
|
|
388
|
-
| `promise<T>(promise: Promise<T>): Semantic<T>` | 创建一个发出 Promise 结果的语义流 | `promise: Promise<T>` | `Semantic<T>` |
|
|
389
|
-
| `range(start: number, end: number): Semantic<number>` | 创建一个发出数字范围的语义流 | `start: number`, `end: number` | `Semantic<number>` |
|
|
390
|
-
| `range(start: number, end: number, step: number): Semantic<number>` | 创建一个使用自定义步长发出范围的语义流 | `start: number`, `end: number`, `step: number` | `Semantic<number>` |
|
|
391
|
-
| `websocket(websocket: WebSocket): Semantic<MessageEvent \| CloseEvent \| Event>` | 创建一个发出 WebSocket 事件的语义流 | `websocket: WebSocket` | `Semantic<MessageEvent \| CloseEvent \| Event>` |
|
|
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) |
|
|
392
362
|
|
|
393
363
|
```typescript
|
|
394
|
-
// Semantic
|
|
364
|
+
// Semantic 工厂方法使用示例
|
|
395
365
|
|
|
396
366
|
// 从定时动画帧创建流
|
|
397
367
|
animationFrame(1000)
|
|
@@ -405,15 +375,15 @@ blob(someBlob, 1024n)
|
|
|
405
375
|
.then(callback) // 写入流成功
|
|
406
376
|
.catch(callback); // 写入流失败
|
|
407
377
|
|
|
408
|
-
//
|
|
378
|
+
// 创建一个空流,在与其他流连接之前不会执行
|
|
409
379
|
empty<string>()
|
|
410
380
|
.toUnordered()
|
|
411
381
|
.join(); //[]
|
|
412
382
|
|
|
413
|
-
//
|
|
383
|
+
// 创建一个填充流
|
|
414
384
|
let filledStream = fill("hello", 3); // "hello", "hello", "hello"
|
|
415
385
|
|
|
416
|
-
// 创建一个具有初始 2 秒延迟和 5
|
|
386
|
+
// 创建一个具有初始 2 秒延迟和 5 秒执行周期的定时流,基于定时器机制实现;可能因系统调度精度限制而出现时间漂移。
|
|
417
387
|
let intervalStream = interval(5000, 2000);
|
|
418
388
|
|
|
419
389
|
// 从可迭代对象创建流
|
|
@@ -423,13 +393,13 @@ let stringStream = from(new Set(["Alex", "Bob"]));
|
|
|
423
393
|
// 从已解析的 Promise 创建流
|
|
424
394
|
let promisedStream: Semantic<Array<number>> = promise(Promise.resolve([1, 2, 3, 4, 5]));
|
|
425
395
|
|
|
426
|
-
//
|
|
396
|
+
// 创建范围流
|
|
427
397
|
let rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
428
398
|
|
|
429
399
|
// WebSocket 事件流
|
|
430
400
|
let ws = new WebSocket("ws://localhost:8080");
|
|
431
401
|
websocket(ws)
|
|
432
|
-
.filter((event): boolean => event.type === "message"); //
|
|
402
|
+
.filter((event): boolean => event.type === "message"); // 仅监听消息事件
|
|
433
403
|
.toUnordered() // 通常事件不需要有序
|
|
434
404
|
.forEach((event): void => receive(event)); // 接收消息
|
|
435
405
|
```
|
|
@@ -437,45 +407,32 @@ websocket(ws)
|
|
|
437
407
|
## Semantic 类方法
|
|
438
408
|
|
|
439
409
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
440
|
-
|
|
441
|
-
| `concat(
|
|
442
|
-
| `concat(
|
|
443
|
-
| `distinct()
|
|
444
|
-
| `distinct
|
|
445
|
-
| `
|
|
446
|
-
| `
|
|
447
|
-
| `
|
|
448
|
-
| `
|
|
449
|
-
| `
|
|
450
|
-
| `
|
|
451
|
-
| `
|
|
452
|
-
| `
|
|
453
|
-
| `
|
|
454
|
-
| `
|
|
455
|
-
| `
|
|
456
|
-
| `
|
|
457
|
-
| `
|
|
458
|
-
| `
|
|
459
|
-
| `
|
|
460
|
-
| `
|
|
461
|
-
| `
|
|
462
|
-
| `
|
|
463
|
-
| `peek(consumer: BiConsumer<E, bigint>): Semantic<E>` | 对元素执行操作(带索引) | O(n) | O(1) |
|
|
464
|
-
| `redirect(redirector: BiFunctional<E, bigint, bigint>): Semantic<E>` | 重定向元素索引 | O(n) | O(1) |
|
|
465
|
-
| `reverse(): Semantic<E>` | 反转元素索引 | O(n) | O(1) |
|
|
466
|
-
| `shuffle(): Semantic<E>` | 随机打乱元素索引 | O(n) | O(1) |
|
|
467
|
-
| `shuffle(mapper: BiFunctional<E, bigint, bigint>): Semantic<E>` | 使用映射器打乱元素索引 | O(n) | O(1) |
|
|
468
|
-
| `skip(n: number): Semantic<E>` | 跳过前 n 个元素 | O(n) | O(1) |
|
|
469
|
-
| `skip(n: bigint): Semantic<E>` | 跳过前 n 个元素 (bigint) | O(n) | O(1) |
|
|
470
|
-
| `sub(start: bigint, end: bigint): Semantic<E>` | 返回语义流子范围 | O(n) | O(1) |
|
|
471
|
-
| `takeWhile(predicate: Predicate<E>): Semantic<E>` | 在断言为真时获取元素 | O(n) | O(1) |
|
|
472
|
-
| `takeWhile(predicate: BiPredicate<E, bigint>): Semantic<E>` | 在断言为真时获取元素(带索引) | O(n) | O(1) |
|
|
473
|
-
| `translate(offset: number): Semantic<E>` | 将元素索引平移偏移量 | O(n) | O(1) |
|
|
474
|
-
| `translate(offset: bigint): Semantic<E>` | 将元素索引平移偏移量 (bigint) | O(n) | O(1) |
|
|
475
|
-
| `translate(translator: BiFunctional<E, bigint, bigint>): Semantic<E>` | 使用转换器平移元素索引 | O(n) | O(1) |
|
|
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) |
|
|
476
433
|
|
|
477
434
|
```typescript
|
|
478
|
-
//
|
|
435
|
+
// Semantic 操作示例
|
|
479
436
|
let result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
480
437
|
.filter((n: number): boolean => n % 2 === 0) // 过滤偶数
|
|
481
438
|
.map((n: number): number => n * 2) // 乘以 2
|
|
@@ -490,7 +447,7 @@ let complexResult = range(1, 100, 1)
|
|
|
490
447
|
.flatMap((n: number): Semantics<number> => from([n, n * 2])) // 将每个元素映射为两个
|
|
491
448
|
.distinct() // 去重
|
|
492
449
|
.shuffle() // 打乱顺序
|
|
493
|
-
.takeWhile((n: number): boolean => n < 50) //
|
|
450
|
+
.takeWhile((n: number): boolean => n < 50) // 取出小于 50 的元素
|
|
494
451
|
.toOrdered() // 转换为有序收集器
|
|
495
452
|
.toArray(); // 转换为数组
|
|
496
453
|
```
|
|
@@ -499,124 +456,108 @@ let complexResult = range(1, 100, 1)
|
|
|
499
456
|
|
|
500
457
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
501
458
|
|------------|------------|------------|------------|
|
|
502
|
-
| `sorted()
|
|
503
|
-
| `sorted(comparator
|
|
504
|
-
| `
|
|
505
|
-
| `
|
|
506
|
-
| `
|
|
507
|
-
| `
|
|
508
|
-
| `
|
|
509
|
-
| `
|
|
510
|
-
| `
|
|
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) |
|
|
511
468
|
|
|
512
469
|
```typescript
|
|
513
|
-
//
|
|
514
|
-
from([6,4,3,5,2]) //
|
|
470
|
+
// 转换为升序排序数组
|
|
471
|
+
from([6,4,3,5,2]) // 创建流
|
|
515
472
|
.sorted() // 将流按升序排序
|
|
516
473
|
.toArray(); // [2, 3, 4, 5, 6]
|
|
517
474
|
|
|
518
|
-
//
|
|
519
|
-
from([6,4,3,5,2]) //
|
|
520
|
-
.
|
|
475
|
+
// 转换为降序排序数组
|
|
476
|
+
from([6,4,3,5,2]) // 创建流
|
|
477
|
+
.soted((a: number, b: number): number => b - a) // 将流按降序排序
|
|
521
478
|
.toArray(); // [6, 5, 4, 3, 2]
|
|
522
479
|
|
|
523
|
-
//
|
|
480
|
+
// 重定向到反向数组
|
|
524
481
|
from([6,4,3,5,2])
|
|
525
|
-
.redirect((element, index): bigint => -index) //
|
|
526
|
-
.
|
|
482
|
+
.redirect((element, index): bigint => -index) // 重定向到反序
|
|
483
|
+
.toOrderd() // 保持重定向后的顺序
|
|
527
484
|
.toArray(); // [2, 5, 3, 4, 6]
|
|
528
485
|
|
|
529
|
-
//
|
|
486
|
+
// 忽略重定向以反转数组
|
|
530
487
|
from([6,4,3,5,2])
|
|
531
|
-
.redirect((element: number, index: bigint) => -index) //
|
|
532
|
-
.
|
|
488
|
+
.redirect((element: number, index: bigint) => -index) // 重定向到反序
|
|
489
|
+
.toUnorderd() // 丢弃重定向顺序。此操作将忽略 `redirect`、`reverse`、`shuffle` 和 `translate` 操作
|
|
533
490
|
.toArray(); // [2, 5, 3, 4, 6]
|
|
534
491
|
|
|
535
|
-
//
|
|
492
|
+
// 反转流为数组
|
|
536
493
|
from([6, 4, 3, 5, 2])
|
|
537
494
|
.reverse() // 反转流
|
|
538
|
-
.toOrdered() //
|
|
495
|
+
.toOrdered() // 保证反转后的顺序
|
|
539
496
|
.toArray(); // [2, 5, 3, 4, 6]
|
|
540
497
|
|
|
541
|
-
//
|
|
498
|
+
// 覆盖洗牌流到数组
|
|
542
499
|
from([6, 4, 3, 5, 2])
|
|
543
500
|
.shuffle() // 打乱流
|
|
544
|
-
.sorted() //
|
|
501
|
+
.sorted() // 覆盖洗牌顺序。此操作将覆盖 `redirect`、`reverse`、`shuffle` 和 `translate` 操作
|
|
545
502
|
.toArray(); // [2, 5, 3, 4, 6]
|
|
546
503
|
|
|
547
504
|
// 转换为窗口收集器
|
|
548
505
|
from([6, 4, 3, 5, 2]).toWindow();
|
|
549
506
|
|
|
550
|
-
//
|
|
507
|
+
// 转换为数字统计
|
|
551
508
|
from([6, 4, 3, 5, 2]).toNumericStatistics();
|
|
552
509
|
|
|
553
|
-
// 转换为
|
|
510
|
+
// 转换为 BigInt 统计
|
|
554
511
|
from([6n, 4n, 3n, 5n, 2n]).toBigintStatistics();
|
|
555
512
|
|
|
556
|
-
//
|
|
513
|
+
// 定义自定义收集器来收集数据
|
|
557
514
|
let customizedCollector = from([1, 2, 3, 4, 5]).toCollectable((generator: Generator<E>) => new CustomizedCollector(generator));
|
|
558
515
|
```
|
|
559
516
|
|
|
560
517
|
## Collectable 收集方法
|
|
561
518
|
|
|
562
519
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
563
|
-
|
|
564
|
-
| `anyMatch(predicate
|
|
565
|
-
| `allMatch(predicate
|
|
566
|
-
| `collect
|
|
567
|
-
| `collect
|
|
568
|
-
| `collect
|
|
569
|
-
| `
|
|
570
|
-
| `
|
|
571
|
-
| `
|
|
572
|
-
| `
|
|
573
|
-
| `
|
|
574
|
-
| `
|
|
575
|
-
| `
|
|
576
|
-
| `
|
|
577
|
-
| `
|
|
578
|
-
| `
|
|
579
|
-
| `
|
|
580
|
-
| `
|
|
581
|
-
| `
|
|
582
|
-
| `
|
|
583
|
-
| `
|
|
584
|
-
| `
|
|
585
|
-
| `
|
|
586
|
-
| `
|
|
587
|
-
| `
|
|
588
|
-
| `
|
|
589
|
-
| `
|
|
590
|
-
| `
|
|
591
|
-
| `
|
|
592
|
-
| `
|
|
593
|
-
| `
|
|
594
|
-
| `
|
|
595
|
-
| `
|
|
596
|
-
| `
|
|
597
|
-
| `
|
|
598
|
-
| `
|
|
599
|
-
| `
|
|
600
|
-
| `
|
|
601
|
-
| `
|
|
602
|
-
| `
|
|
603
|
-
| `
|
|
604
|
-
| `partition(count: bigint): Array<Array<E>>` | 将元素按大小分组 | O(n) | O(n) |
|
|
605
|
-
| `partitionBy(classifier: Functional<E, bigint>): Array<Array<E>>` | 按分类器对元素分区 | O(n) | O(n) |
|
|
606
|
-
| `reduce(accumulator: BiFunctional<E, E, E>): Optional<E>` | 归约元素 | O(n) | O(1) |
|
|
607
|
-
| `reduce(accumulator: TriFunctional<E, E, bigint, E>): Optional<E>` | 归约元素(带索引) | O(n) | O(1) |
|
|
608
|
-
| `reduce(identity: E, accumulator: BiFunctional<E, E, E>): E` | 带恒等值的归约 | O(n) | O(1) |
|
|
609
|
-
| `reduce(identity: E, accumulator: TriFunctional<E, E, bigint, E>): E` | 带恒等值和索引的归约 | O(n) | O(1) |
|
|
610
|
-
| `reduce<R>(identity: R, accumulator: BiFunctional<R, E, R>, finisher: Functional<R, R>): R` | 带最终器的归约 | O(n) | O(1) |
|
|
611
|
-
| `reduce<R>(identity: R, accumulator: TriFunctional<R, E, bigint, R>, finisher: Functional<R, R>): R` | 带索引和最终器的归约 | O(n) | O(1) |
|
|
612
|
-
| `semantic(): Semantic<E>` | 转换为语义流 | O(1) | O(1) |
|
|
613
|
-
| `source(): Generator<E>` | 返回生成器源 | O(1) | O(1) |
|
|
614
|
-
| `toArray(): Array<E>` | 转换为数组 | O(n) | O(n) |
|
|
615
|
-
| `toMap<K, V>(keyExtractor: Functional<E, K>, valueExtractor: Functional<E, V>): Map<K, V>` | 转换为映射 | O(n) | O(n) |
|
|
616
|
-
| `toSet(): Set<E>` | 转换为集合 | O(n) | O(n) |
|
|
617
|
-
| `write<S = string>(stream: WritableStream<S>): Promise<WritableStream<S>>` | 将元素写入可写流 | O(n) | O(1) |
|
|
618
|
-
| `write<S = string>(stream: WritableStream<S>, accumulator: BiFunctional<WritableStream<S>, E, WritableStream<S>>): Promise<WritableStream<S>>` | 使用自定义累加器写入流 | O(n) | O(1) |
|
|
619
|
-
| `write<S = string>(stream: WritableStream<S>, accumulator: TriFunctional<WritableStream<S>, E, bigint, WritableStream<S>>): Promise<WritableStream<S>>` | 使用支持索引感知的累加器写入流 | O(n) | O(1) |
|
|
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) |
|
|
620
561
|
|
|
621
562
|
```typescript
|
|
622
563
|
// Collectable 操作示例
|
|
@@ -637,372 +578,176 @@ let grouped = data.groupBy(
|
|
|
637
578
|
(n: number): string => n > 5 ? "large" : "small",
|
|
638
579
|
(n: number): number => n * 2
|
|
639
580
|
);
|
|
640
|
-
//
|
|
581
|
+
// {small: [4, 8], large: [12, 16, 20]}
|
|
641
582
|
|
|
642
583
|
// 归约操作
|
|
643
584
|
let sum = data.reduce(0, (accumulator: number, n: number): number => accumulator + n); // 30
|
|
644
585
|
|
|
645
586
|
// 输出操作
|
|
646
|
-
data.join(", "); // "2, 4, 6, 8, 10"
|
|
647
|
-
|
|
648
|
-
// 写入流操作
|
|
649
|
-
let writableStream = new WritableStream<string>({
|
|
650
|
-
write(chunk) {
|
|
651
|
-
console.log('写入:', chunk);
|
|
652
|
-
}
|
|
653
|
-
});
|
|
654
|
-
data.write(writableStream)
|
|
655
|
-
.then(() => console.log('写入完成'))
|
|
656
|
-
.catch((err) => console.error('写入失败:', err));
|
|
587
|
+
data.join(", "); // "[2, 4, 6, 8, 10]"
|
|
657
588
|
```
|
|
658
589
|
|
|
659
|
-
##
|
|
660
|
-
|
|
661
|
-
`UnorderedCollectable<E>` 是 `Collectable<E>` 的一种实现,它在处理流时**不保证**元素的顺序,从而在不需要顺序的场景下(例如,仅计算元素数量、总和、是否存在等)可以提供最佳性能。它会自动忽略 `redirect`、`reverse`、`shuffle` 和 `translate` 等会影响顺序的操作。
|
|
590
|
+
## Unordered Collectable 方法
|
|
662
591
|
|
|
663
592
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
664
|
-
|
|
665
|
-
|
|
|
666
|
-
|
|
|
667
|
-
| `: Generator<E, void, undefined>` | 返回迭代器 | O(n) | O(1) |
|
|
668
|
-
| `: AsyncGenerator<E, void, undefined>` | 返回异步迭代器 | O(n) | O(1) |
|
|
669
|
-
|
|
670
|
-
```typescript
|
|
671
|
-
// 创建并操作 UnorderedCollectable
|
|
672
|
-
let unorderedData: UnorderedCollectable<number> = from([5, 3, 8, 1, 4])
|
|
673
|
-
.filter(n => n > 2)
|
|
674
|
-
.toUnordered(); // 转换为无序收集器以获得最佳性能
|
|
675
|
-
|
|
676
|
-
console.log(unorderedData.anyMatch(n => n > 6)); // true
|
|
677
|
-
console.log(unorderedData.count()); // 4n
|
|
678
|
-
console.log(unorderedData.toArray()); // 元素顺序不一定为 [5, 3, 8, 4]
|
|
679
|
-
```
|
|
680
|
-
|
|
681
|
-
## OrderedCollectable 类方法
|
|
593
|
+
|------------|------------|------------|------------|
|
|
594
|
+
| `*` | 遍历所有元素 | O(n) | O(1) |
|
|
595
|
+
| `*` | 异步遍历所有元素 | O(n) | O(1) |
|
|
682
596
|
|
|
683
|
-
|
|
597
|
+
## Ordered Collectable 方法
|
|
684
598
|
|
|
685
599
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
686
|
-
|
|
687
|
-
|
|
|
688
|
-
|
|
|
689
|
-
| `: Generator<E, void, undefined>` | 返回迭代器 | O(n) | O(1) |
|
|
690
|
-
| `: AsyncGenerator<E, void, undefined>` | 返回异步迭代器 | O(n) | O(1) |
|
|
691
|
-
| `source(): Generator<E>` | 返回索引化后的生成器源 | O(1) | O(1) |
|
|
692
|
-
| `isEmpty(): boolean` | 如果缓冲区为空则返回 true | O(1) | O(1) |
|
|
693
|
-
|
|
694
|
-
```typescript
|
|
695
|
-
// 创建并操作 OrderedCollectable
|
|
696
|
-
let orderedData: OrderedCollectable<number> = from([5, 3, 8, 1, 4])
|
|
697
|
-
.sorted(); // 自动创建 OrderedCollectable 并进行升序排序
|
|
698
|
-
|
|
699
|
-
console.log(orderedData.toArray()); // [1, 3, 4, 5, 8]
|
|
700
|
-
|
|
701
|
-
// 使用自定义比较器进行降序排序
|
|
702
|
-
let descendingData: OrderedCollectable<number> = from([5, 3, 8, 1, 4])
|
|
703
|
-
.sorted((a, b) => b - a);
|
|
704
|
-
|
|
705
|
-
console.log(descendingData.toArray()); // [8, 5, 4, 3, 1]
|
|
706
|
-
```
|
|
707
|
-
|
|
708
|
-
## 统计分析类方法
|
|
600
|
+
|------------|------------|------------|------------|
|
|
601
|
+
| `*` | 遍历所有元素 | O(n) | O(1) |
|
|
602
|
+
| `*` | 异步遍历所有元素 | O(n) | O(1) |
|
|
709
603
|
|
|
710
|
-
|
|
604
|
+
## 统计分析方法
|
|
711
605
|
|
|
712
|
-
|
|
606
|
+
### Statistics 方法
|
|
713
607
|
|
|
714
608
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
715
|
-
|
|
716
|
-
|
|
|
717
|
-
|
|
|
718
|
-
|
|
|
719
|
-
|
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
| `average(mapper: Functional<E, D>): D` | 返回映射值的平均值 | O(n) | O(1) |
|
|
723
|
-
| `range(): D` | 返回极差(最大值-最小值) | O(1) | O(1) |
|
|
724
|
-
| `range(mapper: Functional<E, D>): D` | 返回映射值的极差 | O(1) | O(1) |
|
|
725
|
-
| `variance(): D` | 返回方差 | O(n) | O(1) |
|
|
726
|
-
| `variance(mapper: Functional<E, D>): D` | 返回映射值的方差 | O(n) | O(1) |
|
|
727
|
-
| `standardDeviation(): D` | 返回标准差 | O(n) | O(1) |
|
|
728
|
-
| `standardDeviation(mapper: Functional<E, D>): D` | 返回映射值的标准差 | O(n) | O(1) |
|
|
729
|
-
| `mean(): D` | 返回均值(同 average) | O(n) | O(1) |
|
|
730
|
-
| `mean(mapper: Functional<E, D>): D` | 返回映射值的均值 | O(n) | O(1) |
|
|
731
|
-
| `median(): D` | 返回中位数 | O(n) | O(n) |
|
|
732
|
-
| `median(mapper: Functional<E, D>): D` | 返回映射值的中位数 | O(n) | O(n) |
|
|
733
|
-
| `mode(): D` | 返回众数 | O(n) | O(n) |
|
|
734
|
-
| `mode(mapper: Functional<E, D>): D` | 返回映射值的众数 | O(n) | O(n) |
|
|
735
|
-
| `frequency(): Map<E, bigint>` | 返回频率分布 | O(n) | O(n) |
|
|
736
|
-
| `summate(): D` | 返回元素总和 | O(n) | O(1) |
|
|
737
|
-
| `summate(mapper: Functional<E, D>): D` | 返回映射值的总和 | O(n) | O(1) |
|
|
738
|
-
| `quantile(quantile: number): D` | 返回指定分位数 | O(1) | O(1) |
|
|
739
|
-
| `quantile(quantile: number, mapper: Functional<E, D>): D` | 返回映射值的指定分位数 | O(1) | O(1) |
|
|
740
|
-
| `interquartileRange(): D` | 返回四分位距 (IQR) | O(1) | O(1) |
|
|
741
|
-
| `interquartileRange(mapper: Functional<E, D>): D` | 返回映射值的四分位距 | O(1) | O(1) |
|
|
742
|
-
| `skewness(): D` | 返回偏度 | O(n) | O(1) |
|
|
743
|
-
| `skewness(mapper: Functional<E, D>): D` | 返回映射值的偏度 | O(n) | O(1) |
|
|
744
|
-
| `kurtosis(): D` | 返回峰度 | O(n) | O(1) |
|
|
745
|
-
| `kurtosis(mapper: Functional<E, D>): D` | 返回映射值的峰度 | O(n) | O(1) |
|
|
746
|
-
|
|
747
|
-
### NumericStatistics 类方法
|
|
748
|
-
|
|
749
|
-
`NumericStatistics<E>` 继承自 `Statistics<E, number>`,专门用于处理数值类型 (`number`) 的统计分析。
|
|
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 方法
|
|
750
616
|
|
|
751
617
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
752
|
-
|
|
753
|
-
|
|
|
754
|
-
|
|
|
755
|
-
|
|
|
756
|
-
|
|
|
757
|
-
| `
|
|
758
|
-
| `
|
|
759
|
-
| `
|
|
760
|
-
| `
|
|
761
|
-
| `
|
|
762
|
-
| `
|
|
763
|
-
| `
|
|
764
|
-
| `
|
|
765
|
-
| `
|
|
766
|
-
| `
|
|
767
|
-
| `
|
|
768
|
-
| `
|
|
769
|
-
| `
|
|
770
|
-
| `
|
|
771
|
-
| `
|
|
772
|
-
| `
|
|
773
|
-
| `
|
|
774
|
-
| `
|
|
775
|
-
| `
|
|
776
|
-
| `
|
|
777
|
-
| `
|
|
778
|
-
| `
|
|
779
|
-
| `skewness(): number` | 返回数字偏度 | O(n) | O(1) |
|
|
780
|
-
| `skewness(mapper: Functional<E, number>): number` | 返回映射数字值的偏度 | O(n) | O(1) |
|
|
781
|
-
| `kurtosis(): number` | 返回数字峰度 | O(n) | O(1) |
|
|
782
|
-
| `kurtosis(mapper: Functional<E, number>): number` | 返回映射数字值的峰度 | O(n) | O(1) |
|
|
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) |
|
|
783
645
|
|
|
784
646
|
```typescript
|
|
785
|
-
//
|
|
647
|
+
// 统计分析示例
|
|
786
648
|
let numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
787
649
|
.toNumericStatistics();
|
|
788
650
|
|
|
789
|
-
console.log("
|
|
651
|
+
console.log("平均值:", numbers.mean()); // 5.5
|
|
790
652
|
console.log("中位数:", numbers.median()); // 5.5
|
|
791
|
-
console.log("标准差:", numbers.standardDeviation()
|
|
653
|
+
console.log("标准差:", numbers.standardDeviation()); // ~2.87
|
|
792
654
|
console.log("总和:", numbers.summate()); // 55
|
|
793
|
-
console.log("极差:", numbers.range()); // 9
|
|
794
|
-
console.log("四分位距 (IQR):", numbers.interquartileRange()); // 5
|
|
795
|
-
console.log("下四分位数:", numbers.quantile(0.25)); // 3.25
|
|
796
|
-
console.log("偏度:", numbers.skewness().toFixed(2)); // 0
|
|
797
|
-
console.log("峰度:", numbers.kurtosis().toFixed(2)); // ~-1.2
|
|
798
655
|
|
|
799
|
-
//
|
|
656
|
+
// 使用映射器的统计分析
|
|
800
657
|
let objects = from([
|
|
801
|
-
{ value: 10
|
|
802
|
-
{ value: 20
|
|
803
|
-
{ value: 30
|
|
658
|
+
{ value: 10 },
|
|
659
|
+
{ value: 20 },
|
|
660
|
+
{ value: 30 }
|
|
804
661
|
]).toNumericStatistics();
|
|
805
662
|
|
|
806
|
-
console.log("
|
|
807
|
-
console.log("对象值的总和:", objects.summate(obj => obj.value)); // 60
|
|
808
|
-
console.log("对象值的中位数:", objects.median(obj => obj.value)); // 20
|
|
809
|
-
console.log("加权平均值:", objects.summate(obj => obj.value * obj.weight) / objects.summate(obj => obj.weight)); // 24.0
|
|
663
|
+
console.log("映射后的平均值:", objects.mean(obj => obj.value)); // 20
|
|
810
664
|
```
|
|
811
665
|
|
|
812
|
-
###
|
|
813
|
-
|
|
814
|
-
`BigIntStatistics<E>` 继承自 `Statistics<E, bigint>`,专门用于处理大整数类型 (`bigint`) 的统计分析,避免在计算过程中因数值过大而溢出。
|
|
666
|
+
### BigintStatistics 方法
|
|
815
667
|
|
|
816
668
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
817
|
-
|
|
818
|
-
|
|
|
819
|
-
|
|
|
820
|
-
|
|
|
821
|
-
|
|
|
822
|
-
| `
|
|
823
|
-
| `
|
|
824
|
-
| `
|
|
825
|
-
| `
|
|
826
|
-
| `
|
|
827
|
-
| `
|
|
828
|
-
| `
|
|
829
|
-
| `
|
|
830
|
-
| `
|
|
831
|
-
| `
|
|
832
|
-
| `
|
|
833
|
-
| `
|
|
834
|
-
| `
|
|
835
|
-
| `
|
|
836
|
-
| `
|
|
837
|
-
| `
|
|
838
|
-
| `
|
|
839
|
-
| `
|
|
840
|
-
| `
|
|
841
|
-
| `
|
|
842
|
-
| `
|
|
843
|
-
| `
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
| `kurtosis(): bigint` | 返回 bigint 峰度 | O(n) | O(1) |
|
|
847
|
-
| `kurtosis(mapper: Functional<E, bigint>): bigint` | 返回映射 bigint 值的峰度 | O(n) | O(1) |
|
|
848
|
-
|
|
849
|
-
```typescript
|
|
850
|
-
// 大整数统计分析示例
|
|
851
|
-
let bigInts = from([1000n, 2000n, 3000n, 4000n, 5000n, 6000n, 7000n, 8000n, 9000n, 10000n])
|
|
852
|
-
.toBigIntStatistics();
|
|
853
|
-
|
|
854
|
-
console.log("bigint 均值:", bigInts.mean()); // 5500n
|
|
855
|
-
console.log("bigint 总和:", bigInts.summate()); // 55000n
|
|
856
|
-
console.log("bigint 标准差:", bigInts.standardDeviation()); // 3027.65... 注意:计算为 bigint,结果为近似值
|
|
857
|
-
console.log("bigint 中位数:", bigInts.median()); // 5500n
|
|
858
|
-
```
|
|
859
|
-
|
|
860
|
-
## WindowCollectable 类方法
|
|
861
|
-
|
|
862
|
-
`WindowCollectable<E>` 是 `Collectable<E>` 的一种实现,专为**窗口操作**设计。它允许您将元素流划分为重叠或非重叠的窗口(片段),非常适合处理时间序列数据、批处理或滑动平均等场景。
|
|
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 方法
|
|
863
698
|
|
|
864
699
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
865
|
-
|
|
866
|
-
|
|
|
867
|
-
|
|
|
868
|
-
|
|
|
869
|
-
|
|
|
870
|
-
| `
|
|
871
|
-
| `slide(size: bigint, step: bigint): Semantic<Semantic<E>>` | 创建滑动窗口 | O(m × n) | O(m × n) |
|
|
872
|
-
| `tumble(size: bigint): Semantic<Semantic<E>>` | 创建滚动窗口 | O(k × n) | O(k × n) |
|
|
873
|
-
|
|
874
|
-
**参数说明**:
|
|
875
|
-
- `size`: 窗口大小(包含的元素数量)。
|
|
876
|
-
- `step`: 滑动步长(`slide` 方法专用)。
|
|
877
|
-
- 返回值:一个 `Semantic<Semantic<E>>`,其中每个内部 `Semantic<E>` 代表一个窗口。
|
|
878
|
-
|
|
879
|
-
**窗口类型**:
|
|
880
|
-
1. **滑动窗口 (Sliding Window)**: 通过 `slide(size, step)` 创建。窗口按指定步长滑动,相邻窗口之间可以有重叠。
|
|
881
|
-
2. **滚动窗口 (Tumbling Window)**: 通过 `tumble(size)` 创建。窗口是连续且不重叠的,等同于 `slide(size, size)`。
|
|
882
|
-
|
|
883
|
-
```typescript
|
|
884
|
-
// WindowCollectable 操作示例
|
|
885
|
-
let dataStream = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
|
886
|
-
|
|
887
|
-
// 转换为 WindowCollectable
|
|
888
|
-
let windowedData: WindowCollectable<number> = dataStream.toWindow();
|
|
889
|
-
|
|
890
|
-
// 示例 1: 大小为 3 的滑动窗口,步长为 1
|
|
891
|
-
let slidingWindows: Semantic<Semantic<number>> = windowedData.slide(3n, 1n);
|
|
892
|
-
console.log("滑动窗口 (size=3, step=1):");
|
|
893
|
-
slidingWindows.toUnordered()
|
|
894
|
-
.forEach((window, idx) => {
|
|
895
|
-
console.log(` 窗口 ${idx}:`, window.toArray());
|
|
896
|
-
});
|
|
897
|
-
// 输出:
|
|
898
|
-
// 窗口 0: [1, 2, 3]
|
|
899
|
-
// 窗口 1: [2, 3, 4]
|
|
900
|
-
// 窗口 2: [3, 4, 5]
|
|
901
|
-
// ... 以此类推
|
|
902
|
-
|
|
903
|
-
// 示例 2: 大小为 3 的滚动窗口
|
|
904
|
-
let tumblingWindows: Semantic<Semantic<number>> = windowedData.tumble(3n);
|
|
905
|
-
console.log("滚动窗口 (size=3):");
|
|
906
|
-
tumblingWindows.toUnordered()
|
|
907
|
-
.forEach((window, idx) => {
|
|
908
|
-
console.log(` 窗口 ${idx}:`, window.toArray());
|
|
909
|
-
});
|
|
910
|
-
// 输出:
|
|
911
|
-
// 窗口 0: [1, 2, 3]
|
|
912
|
-
// 窗口 1: [4, 5, 6]
|
|
913
|
-
// 窗口 2: [7, 8, 9]
|
|
914
|
-
// 最后一个不完整的窗口 [10] 通常会被丢弃(取决于实现)
|
|
915
|
-
|
|
916
|
-
// 示例 3: 计算每个窗口的平均值
|
|
917
|
-
let slidingWindowAverages = windowedData.slide(5n, 2n) // 大小为5,步长为2的滑动窗口
|
|
918
|
-
.map((windowSemantic) => {
|
|
919
|
-
return windowSemantic
|
|
920
|
-
.toNumericStatistics()
|
|
921
|
-
.average();
|
|
922
|
-
})
|
|
923
|
-
.toUnordered()
|
|
924
|
-
.toArray();
|
|
925
|
-
console.log("滑动窗口平均值 (size=5, step=2):", slidingWindowAverages);
|
|
926
|
-
// 输出: [3, 5, 7] (即 [1,2,3,4,5] 的平均值 3, [3,4,5,6,7] 的平均值 5, [5,6,7,8,9] 的平均值 7)
|
|
927
|
-
```
|
|
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) |
|
|
928
706
|
|
|
929
707
|
## 性能选择指南
|
|
930
708
|
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
### 场景 1:选择 UnorderedCollectable (性能优先)
|
|
934
|
-
当您的操作**不依赖**元素的顺序时,应始终优先使用 `toUnordered()`。这可以避免不必要的排序和索引维护开销,提供最佳性能。`UnorderedCollectable` 会自动忽略 `redirect`、`reverse`、`shuffle` 和 `translate` 等顺序操作。
|
|
935
|
-
|
|
709
|
+
### 选择无序收集器(性能优先)
|
|
936
710
|
```typescript
|
|
937
|
-
//
|
|
711
|
+
// 当不需要顺序保证时,使用无序收集器以获得最佳性能
|
|
938
712
|
let highPerformance = data
|
|
939
|
-
.filter(
|
|
940
|
-
.map(
|
|
941
|
-
.
|
|
942
|
-
|
|
943
|
-
let count = highPerformance.count(); // 快速计数
|
|
944
|
-
let exists = highPerformance.anyMatch((n) => n > 100); // 快速检查
|
|
945
|
-
highPerformance.forEach((n) => console.log(n)); // 快速遍历
|
|
713
|
+
.filter(predicate)
|
|
714
|
+
.map(mapper)
|
|
715
|
+
.toUnoredered(); // 最佳性能
|
|
946
716
|
```
|
|
947
717
|
|
|
948
|
-
###
|
|
949
|
-
当您的操作**依赖**元素的顺序时,必须使用 `OrderedCollectable`。调用 `.sorted()` 方法会自动创建它。它保证了结果的确定性顺序,但会带来 O(n log n) 的排序开销。
|
|
950
|
-
|
|
718
|
+
### 选择有序收集器(需要顺序)
|
|
951
719
|
```typescript
|
|
952
|
-
//
|
|
953
|
-
let ordered = data
|
|
954
|
-
.sorted((a, b) => b - a) // 降序排序,自动创建 OrderedCollectable
|
|
955
|
-
.limit(5); // 取最大的5个
|
|
956
|
-
|
|
957
|
-
let first = ordered.findFirst(); // 获取最大值
|
|
958
|
-
let last = ordered.findLast(); // 获取排序后的最后一个值(即第5大的值)
|
|
720
|
+
// 当需要保持元素顺序时,使用有序收集器
|
|
721
|
+
let ordered = data.sorted(comparator);
|
|
959
722
|
```
|
|
960
723
|
|
|
961
|
-
###
|
|
962
|
-
当您需要对数据流进行**分块**或**滑动**分析时,请使用 `WindowCollectable`。它专门为处理时间窗口、数据批次或滑动聚合而设计。
|
|
963
|
-
|
|
724
|
+
### 选择窗口收集器(窗口操作)
|
|
964
725
|
```typescript
|
|
965
|
-
//
|
|
966
|
-
let
|
|
967
|
-
.toWindow()
|
|
968
|
-
|
|
969
|
-
// 计算每5个元素的滚动平均值
|
|
970
|
-
let movingAverages = windowedData
|
|
971
|
-
.slide(5n, 1n) // 滑动窗口
|
|
972
|
-
.map(window => window.toNumericStatistics().average())
|
|
973
|
-
.toUnordered()
|
|
974
|
-
.toArray();
|
|
726
|
+
// 当需要窗口操作时
|
|
727
|
+
let window: WindowCollectable<number> = data
|
|
728
|
+
.toWindow()
|
|
729
|
+
.slide(5n, 2n); // 滑动窗口
|
|
975
730
|
```
|
|
976
731
|
|
|
977
|
-
###
|
|
978
|
-
当您需要对数值流(`number` 或 `bigint`)进行**统计分析**(如均值、方差、标准差、中位数、分位数等)时,应使用对应的统计类。它们内部已针对这些计算进行了优化。
|
|
979
|
-
|
|
732
|
+
### 选择统计分析(数值计算)
|
|
980
733
|
```typescript
|
|
981
|
-
//
|
|
982
|
-
let
|
|
983
|
-
.toNumericStatistics(); //
|
|
734
|
+
// 当需要统计分析时
|
|
735
|
+
let statistics: NumericStatistics<number> = data
|
|
736
|
+
.toNumericStatistics(); // 数字统计
|
|
984
737
|
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
console.log("90% 分位数:", stats.quantile(0.9));
|
|
988
|
-
|
|
989
|
-
// 对于大整数数据
|
|
990
|
-
let bigIntStats: BigIntStatistics<bigint> = largeIntegerData
|
|
991
|
-
.toBigIntStatistics();
|
|
738
|
+
let bigIntStatistics: BigintStatistics<bigint> = data
|
|
739
|
+
.toBigintStatistics(); // 大整数统计
|
|
992
740
|
```
|
|
993
741
|
|
|
994
|
-
|
|
742
|
+
https://github.com/eloyhere/semantic-typescript
|
|
743
|
+
https://www.npmjs.com/package/semantic-typescript
|
|
995
744
|
|
|
996
|
-
|
|
997
|
-
2. **性能考量**:如果不需要顺序保证,请优先使用 `toUnordered()` 以获得最佳性能。排序操作(`sorted()`)需要 O(n) 的额外空间和 O(n log n) 的时间。
|
|
998
|
-
3. **内存使用**:`WindowCollectable` 和 `Statistics` 类在处理过程中可能需要缓存数据以进行计算,尤其是在进行窗口操作或排序时,请注意大数据集可能带来的内存压力。
|
|
999
|
-
4. **实时数据处理**:`Semantic` 流非常适合处理实时数据源(如 `interval`、`websocket`、`blob`),并支持异步数据源。结合 `WindowCollectable` 可以进行高效的流式分析。
|
|
1000
|
-
5. **短路操作**:利用 `anyMatch`、`allMatch`、`noneMatch`、`findFirst` 等短路操作,可以在满足条件时立即终止流的处理,从而提升效率。
|
|
1001
|
-
6. **类型安全**:该库充分利用 TypeScript 的类型系统,在编译时捕获许多潜在错误。请确保为您的映射器、断言和比较器函数提供正确的类型签名。
|
|
745
|
+
## 重要说明
|
|
1002
746
|
|
|
1003
|
-
|
|
747
|
+
1. **排序操作的影响**:在有序收集器中,`sorted()` 操作会覆盖 `redirect`、`translate`、`shuffle`、`reverse` 的效果。
|
|
748
|
+
2. **性能考量**:如果不需要顺序保证,优先使用 `toUnoredered()` 以获得更好的性能。
|
|
749
|
+
3. **内存使用**:排序操作需要 O(n) 的额外空间。
|
|
750
|
+
4. **实时数据**:Semantic 流适用于处理实时数据,并支持异步数据源。
|
|
1004
751
|
|
|
1005
|
-
---
|
|
1006
752
|
|
|
1007
|
-
|
|
1008
|
-
https://www.npmjs.com/package/semantic-typescript
|
|
753
|
+
这个库为 TypeScript 开发者提供了强大而灵活的流式处理能力,结合了函数式编程的优势和类型安全的保证。
|