semantic-typescript 0.3.7 → 0.4.1
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 +12 -0
- package/dist/collectable.js +82 -2
- package/dist/collector.d.ts +91 -50
- package/dist/collector.js +103 -19
- package/dist/factory.d.ts +5 -1
- package/dist/factory.js +19 -1
- package/dist/guard.d.ts +31 -22
- package/dist/guard.js +89 -59
- package/dist/hash.d.ts +14 -0
- package/dist/hash.js +211 -0
- package/dist/hook.d.ts +16 -3
- package/dist/hook.js +59 -12
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/map.d.ts +72 -0
- package/dist/map.js +247 -0
- package/dist/optional.js +18 -0
- package/dist/semantic.d.ts +15 -4
- package/dist/semantic.js +34 -29
- package/dist/set.d.ts +19 -0
- package/dist/set.js +64 -0
- package/dist/statistics.js +43 -7
- package/dist/symbol.d.ts +8 -0
- package/dist/symbol.js +8 -0
- package/dist/utility.d.ts +8 -1
- package/dist/utility.js +9 -0
- package/dist/window.js +12 -0
- package/package.json +1 -5
- package/readme.cn.md +400 -133
- package/readme.md +342 -241
package/readme.cn.md
CHANGED
|
@@ -1,10 +1,60 @@
|
|
|
1
|
-
# Semantic-TypeScript
|
|
1
|
+
# Semantic-TypeScript 流处理库
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## 介绍
|
|
4
4
|
|
|
5
|
-
Semantic-TypeScript
|
|
5
|
+
**Semantic-TypeScript:面向现代网络开发的范式转移流处理库**
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Semantic-TypeScript 代表了流处理技术的一项重大进步,它融合了来自 JavaScript GeneratorFunction、Java Stream 和 MySQL 索引范式中最有效的概念。其基础设计原则围绕通过复杂的数据索引方法构建异常高效的数据处理流水线。该库专门为现代前端开发提供了一个严格类型安全、函数式纯正的流式操作体验。
|
|
8
|
+
|
|
9
|
+
与传统的同步处理架构相比,Semantic-TypeScript 实现了完全异步的处理模型。在数据流生成期间,数据在终端接收的时间完全由上流的 `accept` 和 `interrupt` 回调机制调用决定。这种深思熟虑的架构选择使该库能够优雅地处理:
|
|
10
|
+
|
|
11
|
+
* **具有确定性延迟特性的实时数据流**
|
|
12
|
+
* **通过内存高效的处理流水线处理大规模数据集**
|
|
13
|
+
* **具有一致性和可靠性保证的异步数据源**
|
|
14
|
+
|
|
15
|
+
该库的创新方法从根本上重新构想了开发者与流数据的交互方式,在一个单一、连贯的包中提供了前所未有的性能和开发者人体工程学特性。
|
|
16
|
+
|
|
17
|
+
### 为什么选择 Semantic-TypeScript?
|
|
18
|
+
|
|
19
|
+
在 TypeScript 项目中选择合适的数据流处理库需要在性能、开发者体验和架构契合度之间取得平衡。Semantic-TypeScript 旨在在所有维度上都表现出色,为现代网络提供了一种范式转移的方法。以下为其脱颖而出之处:
|
|
20
|
+
|
|
21
|
+
#### 1. **统一的、类型安全的流式范式**
|
|
22
|
+
Semantic-TypeScript 融合了**JavaScript GeneratorFunctions**、**Java Streams API** 和**数据库索引策略**中最有效的概念。它为处理任何数据序列(无论是静态数组、实时事件还是异步块)提供了一致的声明式 API,同时利用 TypeScript 的全部功能确保端到端的类型安全。这消除了一整类运行时错误,并将流操作转变为可预测的、编译器验证的活动。
|
|
23
|
+
|
|
24
|
+
#### 2. **智能惰性求值带来的不妥协性能**
|
|
25
|
+
其核心建立在**惰性求值**之上。像 `filter`、`map` 和 `flatMap` 这样的操作仅仅组合了一个处理流水线;直到终端操作(如 `collect` 或 `toArray`)被调用时才会进行实际工作。这与**短路**能力(通过 `limit`、`anyMatch` 或自定义的 `interruptor` 函数等操作)相结合,允许在处理结果已知时提前停止,从而显著提高处理大规模或无限流的效率。
|
|
26
|
+
|
|
27
|
+
#### 3. **架构区分:`Semantic<E>` 与 `Collectable<E>`**
|
|
28
|
+
该库引入了一个其他库通常缺乏的关键架构分离:
|
|
29
|
+
* **`Semantic<E>`**:表示抽象的、惰性的流定义——数据转换的“蓝图”。它是不可变且可组合的。
|
|
30
|
+
* **`Collectable<E>`**:表示一个物化的、可执行的流视图,提供所有终端操作。
|
|
31
|
+
|
|
32
|
+
这种分离强制了清晰的心智模型,并允许进行优化(例如,如果顺序不重要,`UnorderedCollectable` 可以跳过昂贵的排序步骤)。
|
|
33
|
+
|
|
34
|
+
#### 4. **`Collector<E, A, R>` 模式的强大威力**
|
|
35
|
+
受 Java 启发,`Collector` 模式是灵活性的引擎。它将*如何累加*流元素的*规范*与流本身的*执行*解耦。库提供了一组丰富的内置收集器(`useToArray`、`useGroupBy`、`useSummate` 等)用于日常任务,同时该模式让实现您自己复杂的、可重用的归约逻辑变得简单。这比一组固定的终端方法要强大得多,也更具可组合性。
|
|
36
|
+
|
|
37
|
+
#### 5. **对现代网络和异步数据的一流支持**
|
|
38
|
+
Semantic-TypeScript 专为现代前端和 Node.js 开发而设计。它为现代网络源提供了原生的工厂方法:
|
|
39
|
+
* `from(iterable)`、`range()` 用于静态数据。
|
|
40
|
+
* `interval()`、`animationFrame()` 用于基于时间的流。
|
|
41
|
+
* `blob()` 用于分块二进制数据处理。
|
|
42
|
+
* `websocket()` 用于实时消息流。
|
|
43
|
+
它对 `Iterable` 和 `AsyncIterable` 协议的基础支持意味着它用相同的优雅 API 处理同步和异步数据流。
|
|
44
|
+
|
|
45
|
+
#### 6. **超越基本聚合:内置统计分析**
|
|
46
|
+
超越简单的求和与平均值。该库提供了专门的 `NumericStatistics` 和 `BigIntStatistics` 类,可以直接从您的流中即时访问高级统计指标——**方差、标准差、中位数、分位数、偏度、峰度**。这使复杂的数据分析变成一行代码,省去了手动实现或集成另一个专门库的麻烦。
|
|
47
|
+
|
|
48
|
+
#### 7. **为开发者人体工程学而设计**
|
|
49
|
+
* **流畅、可链式调用的 API**:将复杂的数据流水线编写为可读的、顺序的操作链。
|
|
50
|
+
* **全面的实用工具套件**:开箱即用,包含必要的守卫(`isOptional`、`isSemantic`)、类型安全的实用程序(`useCompare`、`useTraverse`)和函数式接口。
|
|
51
|
+
* **`Optional<T>` 集成**:安全地建模值的缺失,消除查找操作中的空指针问题。
|
|
52
|
+
* **性能指南**:文档清晰地指导您何时使用 `toUnordered()`(追求最大速度)与 `toOrdered()`(当顺序重要时)。
|
|
53
|
+
|
|
54
|
+
#### 8. **健壮、面向社区的基础**
|
|
55
|
+
作为一个托管在 **GitHub** 上并通过 **npm** 分发的开源库,它专为实际应用而构建。详尽的文档,附带时间和空间复杂度注解及实际示例,降低了学习曲线,并为性能敏感的应用提供了清晰性。
|
|
56
|
+
|
|
57
|
+
**总而言之,如果您寻求一个严格设计、类型安全且高性能的流处理库,它将企业级数据转换模式的力量带入 TypeScript 生态系统,同时又不妥协于现代网络开发的惯用语法和需求,请选择 Semantic-TypeScript。**
|
|
8
58
|
|
|
9
59
|
## 安装
|
|
10
60
|
|
|
@@ -12,11 +62,11 @@ Semantic-TypeScript 是一个受 JavaScript GeneratorFunction、Java Stream 和
|
|
|
12
62
|
npm install semantic-typescript
|
|
13
63
|
```
|
|
14
64
|
|
|
15
|
-
##
|
|
65
|
+
## 基本类型
|
|
16
66
|
|
|
17
67
|
| 类型 | 描述 |
|
|
18
|
-
|
|
19
|
-
| `Invalid<T>` |
|
|
68
|
+
|------|-------------|
|
|
69
|
+
| `Invalid<T>` | 继承自 `null` 或 `undefined` 的类型 |
|
|
20
70
|
| `Valid<T>` | 排除 `null` 和 `undefined` 的类型 |
|
|
21
71
|
| `MaybeInvalid<T>` | 可能为 `null` 或 `undefined` 的类型 |
|
|
22
72
|
| `Primitive` | 原始类型的集合 |
|
|
@@ -35,18 +85,18 @@ npm install semantic-typescript
|
|
|
35
85
|
## 函数式接口
|
|
36
86
|
|
|
37
87
|
| 接口 | 描述 |
|
|
38
|
-
|
|
39
|
-
| `Runnable` |
|
|
88
|
+
|-----------|-------------|
|
|
89
|
+
| `Runnable` | 无参数无返回值的函数 |
|
|
40
90
|
| `Supplier<R>` | 无参数并返回 `R` 的函数 |
|
|
41
91
|
| `Functional<T, R>` | 单参数转换函数 |
|
|
42
92
|
| `BiFunctional<T, U, R>` | 双参数转换函数 |
|
|
43
93
|
| `TriFunctional<T, U, V, R>` | 三参数转换函数 |
|
|
44
|
-
| `Predicate<T>` |
|
|
45
|
-
| `BiPredicate<T, U>` |
|
|
46
|
-
| `TriPredicate<T, U, V>` |
|
|
47
|
-
| `Consumer<T>` |
|
|
48
|
-
| `BiConsumer<T, U>` |
|
|
49
|
-
| `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>` | 三参数消费者函数 |
|
|
50
100
|
| `Comparator<T>` | 双参数比较函数 |
|
|
51
101
|
| `Generator<T>` | 生成器函数(核心与基础) |
|
|
52
102
|
|
|
@@ -61,8 +111,8 @@ let comparator: Comparator<number> = (a: number, b: number): number => a - b;
|
|
|
61
111
|
|
|
62
112
|
| 函数 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
63
113
|
|------|------|------------|------------|
|
|
64
|
-
| `validate<T>(t: MaybeInvalid<T>): t is T` |
|
|
65
|
-
| `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` |
|
|
114
|
+
| `validate<T>(t: MaybeInvalid<T>): t is T` | 验证值不为 null 或 undefined | O(1) | O(1) |
|
|
115
|
+
| `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | 验证值为 null 或 undefined | O(1) | O(1) |
|
|
66
116
|
| `isBoolean(t: unknown): t is boolean` | 检查是否为布尔值 | O(1) | O(1) |
|
|
67
117
|
| `isString(t: unknown): t is string` | 检查是否为字符串 | O(1) | O(1) |
|
|
68
118
|
| `isNumber(t: unknown): t is number` | 检查是否为数字 | O(1) | O(1) |
|
|
@@ -83,7 +133,9 @@ let comparator: Comparator<number> = (a: number, b: number): number => a - b;
|
|
|
83
133
|
| `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | 检查是否为 NumericStatistics 实例 | O(1) | O(1) |
|
|
84
134
|
| `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | 检查是否为 BigIntStatistics 实例 | O(1) | O(1) |
|
|
85
135
|
| `isPromise(t: unknown): t is Promise<unknown>` | 检查是否为 Promise 对象 | O(1) | O(1) |
|
|
86
|
-
| `
|
|
136
|
+
| `isAsyncFunction(t: unknown): t is AsyncFunction` | 检查是否为 AsyncFunction | O(1) | O(1) |
|
|
137
|
+
| `isGeneratorFunction(t: unknown): t is GeneratorFunction` | 检查是否为 GeneratorFunction | O(1) | O(1) |
|
|
138
|
+
| `isAsyncGeneratorFunction(t: unknown): t is AsyncGeneratorFunction` | 检查是否为 AsyncGeneratorFunction | O(1) | O(1) |
|
|
87
139
|
|
|
88
140
|
```typescript
|
|
89
141
|
// 类型守卫使用示例
|
|
@@ -94,11 +146,11 @@ if (isString(value)) {
|
|
|
94
146
|
}
|
|
95
147
|
|
|
96
148
|
if (isOptional(someValue)) {
|
|
97
|
-
someValue.ifPresent((value): void => console.log(
|
|
149
|
+
someValue.ifPresent((value): void => console.log(value));
|
|
98
150
|
}
|
|
99
151
|
|
|
100
152
|
if(isIterable(value)){
|
|
101
|
-
//
|
|
153
|
+
// 类型安全,现在它是一个可迭代对象
|
|
102
154
|
for(let item of value){
|
|
103
155
|
console.log(item);
|
|
104
156
|
}
|
|
@@ -109,15 +161,45 @@ if(isIterable(value)){
|
|
|
109
161
|
|
|
110
162
|
| 函数 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
111
163
|
|------|------|------------|------------|
|
|
112
|
-
| `useCompare<T>(t1: T, t2: T): number` |
|
|
164
|
+
| `useCompare<T>(t1: T, t2: T): number` | 通用比较函数 | O(1) | O(1) |
|
|
113
165
|
| `useRandom<T = number \| bigint>(index: T): T` | 伪随机数生成器 | O(log n) | O(1) |
|
|
166
|
+
| `useTraverse(t, callback)` | 深度遍历对象,不处理循环引用 | O(n) | O(1) |
|
|
167
|
+
| `useToNumber(t: unknown): number` | 将值转换为数字 | O(1) | O(1) |
|
|
168
|
+
| `useToBigInt(t: unknown): bigint` | 将值转换为 BigInt | O(1) | O(1) |
|
|
114
169
|
|
|
115
170
|
```typescript
|
|
116
171
|
// 工具函数使用示例
|
|
117
172
|
let numbers: Array<number> = [3, 1, 4, 1, 5];
|
|
118
173
|
numbers.sort(useCompare); // [1, 1, 3, 4, 5]
|
|
119
174
|
|
|
120
|
-
let randomNum = useRandom(42); // 基于种子的随机数
|
|
175
|
+
let randomNum: number = useRandom(42); // 基于种子的随机数
|
|
176
|
+
|
|
177
|
+
let o = {
|
|
178
|
+
a: 1,
|
|
179
|
+
b: {
|
|
180
|
+
c: 2,
|
|
181
|
+
d: o
|
|
182
|
+
},
|
|
183
|
+
c: [1, 3, 5, o],
|
|
184
|
+
e: undefined,
|
|
185
|
+
f: null
|
|
186
|
+
};
|
|
187
|
+
useTraverse(o, (value, key): boolean => {
|
|
188
|
+
console.log(key, value);
|
|
189
|
+
/*
|
|
190
|
+
a 1
|
|
191
|
+
c 2
|
|
192
|
+
1 3 5
|
|
193
|
+
循环引用、undefined 和 null 值不会被遍历。
|
|
194
|
+
*/
|
|
195
|
+
return true; // 返回 true 以继续遍历
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
let toBeResolved: object = {
|
|
199
|
+
[Symbol.toPrimitive]: () => 5
|
|
200
|
+
};
|
|
201
|
+
let resolvedNumber: number = useToNumber(toBeResolved); // 5
|
|
202
|
+
let resolvedBigInt: bigint = useToBigInt(toBeResolved); // 5n
|
|
121
203
|
```
|
|
122
204
|
|
|
123
205
|
## 工厂方法
|
|
@@ -127,9 +209,9 @@ let randomNum = useRandom(42); // 基于种子的随机数
|
|
|
127
209
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
128
210
|
|------|------|------------|------------|
|
|
129
211
|
| `Optional.empty<T>()` | 创建一个空的 Optional | O(1) | O(1) |
|
|
130
|
-
| `Optional.of<T>(value)` |
|
|
131
|
-
| `Optional.ofNullable<T>(value)` |
|
|
132
|
-
| `Optional.ofNonNull<T>(value)` |
|
|
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) |
|
|
133
215
|
|
|
134
216
|
```typescript
|
|
135
217
|
// Optional 使用示例
|
|
@@ -146,52 +228,135 @@ console.log(empty.get(100)); // 输出 100
|
|
|
146
228
|
|
|
147
229
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
148
230
|
|------|------|------------|------------|
|
|
149
|
-
| `Collector.full(identity, accumulator, finisher)` |
|
|
150
|
-
| `Collector.shortable(identity, interruptor, accumulator, finisher)` |
|
|
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) |
|
|
151
301
|
|
|
152
302
|
```typescript
|
|
153
|
-
//
|
|
303
|
+
// 收集器转换示例
|
|
154
304
|
let numbers: Semantic<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
|
|
155
305
|
|
|
156
|
-
//
|
|
306
|
+
// 性能优先:使用无序收集器
|
|
157
307
|
let unordered: UnorderedCollectable<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5])
|
|
158
308
|
.filter((n: number): boolean => n > 3)
|
|
159
309
|
.toUnoredered();
|
|
160
310
|
|
|
161
|
-
// 需要排序:使用有序收集器
|
|
311
|
+
// 需要排序:使用有序收集器
|
|
162
312
|
let ordered: OrderedCollectable<number> = from([3, 1, 4, 1, 5, 9, 2, 6, 5])
|
|
163
313
|
.sorted();
|
|
164
314
|
|
|
165
315
|
// 统计元素数量
|
|
166
|
-
let count: Collector<number, number, number> =
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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]); // 从可迭代对象中求平均
|
|
182
334
|
```
|
|
183
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
|
+
|
|
184
347
|
### Semantic 工厂方法
|
|
185
348
|
|
|
186
349
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
187
350
|
|------|------|------------|------------|
|
|
188
|
-
| `animationFrame(period: number, delay: number = 0)` |
|
|
351
|
+
| `animationFrame(period: number, delay: number = 0)` | 创建一个定时的动画帧流 | O(1)* | O(1) |
|
|
352
|
+
| `attribute(target)` | 从对象的深层属性创建流 | O(n) | O(1) |
|
|
189
353
|
| `blob(blob, chunkSize)` | 从 Blob 创建流 | O(n) | O(chunkSize) |
|
|
190
|
-
| `empty<E>()` |
|
|
191
|
-
| `fill<E>(element, count)` |
|
|
354
|
+
| `empty<E>()` | 创建一个空流 | O(1) | O(1) |
|
|
355
|
+
| `fill<E>(element, count)` | 创建一个填充流 | O(n) | O(1) |
|
|
192
356
|
| `from<E>(iterable)` | 从可迭代对象创建流 | O(1) | O(1) |
|
|
193
|
-
| `interval(period, delay?)` |
|
|
357
|
+
| `interval(period, delay?)` | 创建一个定时间隔流 | O(1)* | O(1) |
|
|
194
358
|
| `iterate<E>(generator)` | 从生成器创建流 | O(1) | O(1) |
|
|
359
|
+
| `promise<E>(promise)` | 从 Promise 创建流 | O(1) | O(1) |
|
|
195
360
|
| `range(start, end, step)` | 创建数值范围流 | O(n) | O(1) |
|
|
196
361
|
| `websocket(websocket)` | 从 WebSocket 创建流 | O(1) | O(1) |
|
|
197
362
|
|
|
@@ -201,7 +366,7 @@ find.collect([1,2,3,4,5]); // 查找第一个元素
|
|
|
201
366
|
// 从定时动画帧创建流
|
|
202
367
|
animationFrame(1000)
|
|
203
368
|
.toUnordered()
|
|
204
|
-
.forEach(frame => console.log(frame));
|
|
369
|
+
.forEach((frame): void => console.log(frame));
|
|
205
370
|
|
|
206
371
|
// 从 Blob 创建流(分块读取)
|
|
207
372
|
blob(someBlob, 1024n)
|
|
@@ -210,15 +375,15 @@ blob(someBlob, 1024n)
|
|
|
210
375
|
.then(callback) // 写入流成功
|
|
211
376
|
.catch(callback); // 写入流失败
|
|
212
377
|
|
|
213
|
-
//
|
|
378
|
+
// 创建一个空流,在与其他流连接之前不会执行
|
|
214
379
|
empty<string>()
|
|
215
380
|
.toUnordered()
|
|
216
381
|
.join(); //[]
|
|
217
382
|
|
|
218
|
-
//
|
|
383
|
+
// 创建一个填充流
|
|
219
384
|
let filledStream = fill("hello", 3); // "hello", "hello", "hello"
|
|
220
385
|
|
|
221
|
-
//
|
|
386
|
+
// 创建一个具有初始 2 秒延迟和 5 秒执行周期的定时流,基于定时器机制实现;可能因系统调度精度限制而出现时间漂移。
|
|
222
387
|
let intervalStream = interval(5000, 2000);
|
|
223
388
|
|
|
224
389
|
// 从可迭代对象创建流
|
|
@@ -226,7 +391,7 @@ let numberStream = from([1, 2, 3, 4, 5]);
|
|
|
226
391
|
let stringStream = from(new Set(["Alex", "Bob"]));
|
|
227
392
|
|
|
228
393
|
// 从已解析的 Promise 创建流
|
|
229
|
-
let promisedStream: Semantic<Array<number>> = Promise.resolve([1, 2, 3, 4, 5]);
|
|
394
|
+
let promisedStream: Semantic<Array<number>> = promise(Promise.resolve([1, 2, 3, 4, 5]));
|
|
230
395
|
|
|
231
396
|
// 创建范围流
|
|
232
397
|
let rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
@@ -235,7 +400,7 @@ let rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
|
235
400
|
let ws = new WebSocket("ws://localhost:8080");
|
|
236
401
|
websocket(ws)
|
|
237
402
|
.filter((event): boolean => event.type === "message"); // 仅监听消息事件
|
|
238
|
-
.toUnordered() //
|
|
403
|
+
.toUnordered() // 通常事件不需要有序
|
|
239
404
|
.forEach((event): void => receive(event)); // 接收消息
|
|
240
405
|
```
|
|
241
406
|
|
|
@@ -243,20 +408,21 @@ websocket(ws)
|
|
|
243
408
|
|
|
244
409
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
245
410
|
|------|------|------------|------------|
|
|
246
|
-
| `concat(
|
|
411
|
+
| `concat(semantic)` | 连接两个流 | O(n) | O(1) |
|
|
412
|
+
| `concat(iterable)` | 从可迭代对象连接 | O(n) | O(1) |
|
|
247
413
|
| `distinct()` | 去重 | O(n) | O(n) |
|
|
248
414
|
| `distinct(comparator)` | 使用比较器去重 | O(n²) | O(n) |
|
|
249
415
|
| `dropWhile(predicate)` | 丢弃满足条件的元素 | O(n) | O(1) |
|
|
250
416
|
| `filter(predicate)` | 过滤元素 | O(n) | O(1) |
|
|
251
417
|
| `flat(mapper)` | 扁平化映射 | O(n × m) | O(1) |
|
|
252
|
-
| `flatMap(mapper)` |
|
|
418
|
+
| `flatMap(mapper)` | 扁平化映射为新类型 | O(n × m) | O(1) |
|
|
253
419
|
| `limit(n)` | 限制元素数量 | O(n) | O(1) |
|
|
254
420
|
| `map(mapper)` | 映射转换 | O(n) | O(1) |
|
|
255
421
|
| `peek(consumer)` | 查看元素 | O(n) | O(1) |
|
|
256
422
|
| `redirect(redirector)` | 重定向索引 | O(n) | O(1) |
|
|
257
423
|
| `reverse()` | 反转流 | O(n) | O(1) |
|
|
258
|
-
| `shuffle()` |
|
|
259
|
-
| `shuffle(mapper)` |
|
|
424
|
+
| `shuffle()` | 随机洗牌 | O(n) | O(1) |
|
|
425
|
+
| `shuffle(mapper)` | 使用映射器洗牌 | O(n) | O(1) |
|
|
260
426
|
| `skip(n)` | 跳过前 n 个元素 | O(n) | O(1) |
|
|
261
427
|
| `sorted()` | 排序 | O(n log n) | O(n) |
|
|
262
428
|
| `sorted(comparator)` | 使用比较器排序 | O(n log n) | O(n) |
|
|
@@ -278,10 +444,10 @@ let result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
|
278
444
|
|
|
279
445
|
// 复杂操作示例
|
|
280
446
|
let complexResult = range(1, 100, 1)
|
|
281
|
-
.flatMap((n: number): Semantics<number> => from([n, n * 2])) //
|
|
447
|
+
.flatMap((n: number): Semantics<number> => from([n, n * 2])) // 将每个元素映射为两个
|
|
282
448
|
.distinct() // 去重
|
|
283
449
|
.shuffle() // 打乱顺序
|
|
284
|
-
.takeWhile((n: number): boolean => n < 50) //
|
|
450
|
+
.takeWhile((n: number): boolean => n < 50) // 取出小于 50 的元素
|
|
285
451
|
.toOrdered() // 转换为有序收集器
|
|
286
452
|
.toArray(); // 转换为数组
|
|
287
453
|
```
|
|
@@ -291,53 +457,54 @@ let complexResult = range(1, 100, 1)
|
|
|
291
457
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
292
458
|
|------------|------------|------------|------------|
|
|
293
459
|
| `sorted()` | 转换为有序收集器 | O(n log n) | O(n) |
|
|
460
|
+
| `sorted(comparator)` | 使用比较器转换为有序收集器 | O(n log n) | O(n) |
|
|
294
461
|
| `toUnordered()` | 转换为无序收集器 | O(1) | O(1) |
|
|
295
462
|
| `toOrdered()` | 转换为有序收集器 | O(1) | O(1) |
|
|
296
|
-
| `toNumericStatistics()` |
|
|
463
|
+
| `toNumericStatistics()` | 转换为数字统计 | O(n) | O(1) |
|
|
297
464
|
| `toBigintStatistics()` | 转换为 BigInt 统计 | O(n) | O(1) |
|
|
298
465
|
| `toWindow()` | 转换为窗口收集器 | O(1) | O(1) |
|
|
299
466
|
| `toCollectable()` | 转换为 `UnorderdCollectable` | O(n) | O(1) |
|
|
300
|
-
| `toCollectable(mapper)` |
|
|
467
|
+
| `toCollectable(mapper)` | 转换为自定义的 collectable | O(n) | O(1) |
|
|
301
468
|
|
|
302
469
|
```typescript
|
|
303
|
-
//
|
|
470
|
+
// 转换为升序排序数组
|
|
304
471
|
from([6,4,3,5,2]) // 创建流
|
|
305
|
-
.sorted() //
|
|
472
|
+
.sorted() // 将流按升序排序
|
|
306
473
|
.toArray(); // [2, 3, 4, 5, 6]
|
|
307
474
|
|
|
308
|
-
//
|
|
475
|
+
// 转换为降序排序数组
|
|
309
476
|
from([6,4,3,5,2]) // 创建流
|
|
310
|
-
.soted((a: number, b: number): number => b - a) //
|
|
477
|
+
.soted((a: number, b: number): number => b - a) // 将流按降序排序
|
|
311
478
|
.toArray(); // [6, 5, 4, 3, 2]
|
|
312
479
|
|
|
313
|
-
//
|
|
480
|
+
// 重定向到反向数组
|
|
314
481
|
from([6,4,3,5,2])
|
|
315
|
-
.redirect((element, index): bigint => -index) //
|
|
316
|
-
.toOrderd() //
|
|
482
|
+
.redirect((element, index): bigint => -index) // 重定向到反序
|
|
483
|
+
.toOrderd() // 保持重定向后的顺序
|
|
317
484
|
.toArray(); // [2, 5, 3, 4, 6]
|
|
318
485
|
|
|
319
|
-
//
|
|
486
|
+
// 忽略重定向以反转数组
|
|
320
487
|
from([6,4,3,5,2])
|
|
321
|
-
.redirect((element: number, index: bigint) => -index) //
|
|
488
|
+
.redirect((element: number, index: bigint) => -index) // 重定向到反序
|
|
322
489
|
.toUnorderd() // 丢弃重定向顺序。此操作将忽略 `redirect`、`reverse`、`shuffle` 和 `translate` 操作
|
|
323
490
|
.toArray(); // [2, 5, 3, 4, 6]
|
|
324
491
|
|
|
325
492
|
// 反转流为数组
|
|
326
493
|
from([6, 4, 3, 5, 2])
|
|
327
494
|
.reverse() // 反转流
|
|
328
|
-
.toOrdered() //
|
|
495
|
+
.toOrdered() // 保证反转后的顺序
|
|
329
496
|
.toArray(); // [2, 5, 3, 4, 6]
|
|
330
497
|
|
|
331
|
-
//
|
|
498
|
+
// 覆盖洗牌流到数组
|
|
332
499
|
from([6, 4, 3, 5, 2])
|
|
333
500
|
.shuffle() // 打乱流
|
|
334
|
-
.sorted() //
|
|
501
|
+
.sorted() // 覆盖洗牌顺序。此操作将覆盖 `redirect`、`reverse`、`shuffle` 和 `translate` 操作
|
|
335
502
|
.toArray(); // [2, 5, 3, 4, 6]
|
|
336
503
|
|
|
337
504
|
// 转换为窗口收集器
|
|
338
505
|
from([6, 4, 3, 5, 2]).toWindow();
|
|
339
506
|
|
|
340
|
-
//
|
|
507
|
+
// 转换为数字统计
|
|
341
508
|
from([6, 4, 3, 5, 2]).toNumericStatistics();
|
|
342
509
|
|
|
343
510
|
// 转换为 BigInt 统计
|
|
@@ -347,37 +514,58 @@ from([6n, 4n, 3n, 5n, 2n]).toBigintStatistics();
|
|
|
347
514
|
let customizedCollector = from([1, 2, 3, 4, 5]).toCollectable((generator: Generator<E>) => new CustomizedCollector(generator));
|
|
348
515
|
```
|
|
349
516
|
|
|
350
|
-
## Collectable
|
|
517
|
+
## Collectable 收集方法
|
|
351
518
|
|
|
352
519
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
353
520
|
|------|------|------------|------------|
|
|
354
|
-
| `anyMatch(predicate)` |
|
|
355
|
-
| `allMatch(predicate)` |
|
|
356
|
-
| `
|
|
357
|
-
| `
|
|
358
|
-
| `
|
|
359
|
-
| `
|
|
360
|
-
| `
|
|
361
|
-
| `
|
|
362
|
-
| `
|
|
363
|
-
| `
|
|
364
|
-
| `
|
|
365
|
-
| `
|
|
366
|
-
| `
|
|
367
|
-
| `
|
|
368
|
-
| `
|
|
369
|
-
| `
|
|
370
|
-
| `
|
|
371
|
-
| `
|
|
372
|
-
| `
|
|
373
|
-
| `
|
|
374
|
-
| `
|
|
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) |
|
|
375
561
|
|
|
376
562
|
```typescript
|
|
377
563
|
// Collectable 操作示例
|
|
378
|
-
|
|
564
|
+
let data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
379
565
|
.filter((n: number): boolean => n % 2 === 0)
|
|
380
|
-
.toOrdered();
|
|
566
|
+
.toOrdered();
|
|
567
|
+
|
|
568
|
+
// 匹配检查
|
|
381
569
|
console.log(data.anyMatch((n: number): boolean => n > 5)); // true
|
|
382
570
|
console.log(data.allMatch((n: number): boolean => n < 20)); // true
|
|
383
571
|
|
|
@@ -386,76 +574,154 @@ data.findFirst().ifPresent((n: number): void => console.log(n)); // 2
|
|
|
386
574
|
data.findAny().ifPresent((n: number): void => console.log(n)); // 任意元素
|
|
387
575
|
|
|
388
576
|
// 分组操作
|
|
389
|
-
|
|
390
|
-
(n: number): string =>
|
|
577
|
+
let grouped = data.groupBy(
|
|
578
|
+
(n: number): string => n > 5 ? "large" : "small",
|
|
391
579
|
(n: number): number => n * 2
|
|
392
|
-
);
|
|
580
|
+
);
|
|
581
|
+
// {small: [4, 8], large: [12, 16, 20]}
|
|
393
582
|
|
|
394
583
|
// 归约操作
|
|
395
|
-
|
|
584
|
+
let sum = data.reduce(0, (accumulator: number, n: number): number => accumulator + n); // 30
|
|
396
585
|
|
|
397
586
|
// 输出操作
|
|
398
587
|
data.join(", "); // "[2, 4, 6, 8, 10]"
|
|
399
588
|
```
|
|
400
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
|
+
|
|
401
604
|
## 统计分析方法
|
|
402
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
|
+
|
|
403
615
|
### NumericStatistics 方法
|
|
404
616
|
|
|
405
617
|
| 方法 | 描述 | 时间复杂度 | 空间复杂度 |
|
|
406
618
|
|------|------|------------|------------|
|
|
407
|
-
|
|
|
408
|
-
|
|
|
409
|
-
| `
|
|
410
|
-
| `
|
|
411
|
-
| `
|
|
412
|
-
| `
|
|
413
|
-
| `
|
|
414
|
-
| `
|
|
415
|
-
| `
|
|
416
|
-
| `
|
|
417
|
-
| `
|
|
418
|
-
| `
|
|
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) |
|
|
419
645
|
|
|
420
646
|
```typescript
|
|
421
647
|
// 统计分析示例
|
|
422
|
-
|
|
648
|
+
let numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
423
649
|
.toNumericStatistics();
|
|
650
|
+
|
|
424
651
|
console.log("平均值:", numbers.mean()); // 5.5
|
|
425
652
|
console.log("中位数:", numbers.median()); // 5.5
|
|
426
653
|
console.log("标准差:", numbers.standardDeviation()); // ~2.87
|
|
427
654
|
console.log("总和:", numbers.summate()); // 55
|
|
428
655
|
|
|
429
656
|
// 使用映射器的统计分析
|
|
430
|
-
|
|
657
|
+
let objects = from([
|
|
431
658
|
{ value: 10 },
|
|
432
659
|
{ value: 20 },
|
|
433
660
|
{ value: 30 }
|
|
434
661
|
]).toNumericStatistics();
|
|
662
|
+
|
|
435
663
|
console.log("映射后的平均值:", objects.mean(obj => obj.value)); // 20
|
|
436
664
|
```
|
|
437
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
|
+
|
|
438
707
|
## 性能选择指南
|
|
439
708
|
|
|
440
709
|
### 选择无序收集器(性能优先)
|
|
441
|
-
|
|
442
710
|
```typescript
|
|
443
711
|
// 当不需要顺序保证时,使用无序收集器以获得最佳性能
|
|
444
712
|
let highPerformance = data
|
|
445
713
|
.filter(predicate)
|
|
446
714
|
.map(mapper)
|
|
447
|
-
.
|
|
715
|
+
.toUnoredered(); // 最佳性能
|
|
448
716
|
```
|
|
449
717
|
|
|
450
718
|
### 选择有序收集器(需要顺序)
|
|
451
|
-
|
|
452
719
|
```typescript
|
|
453
720
|
// 当需要保持元素顺序时,使用有序收集器
|
|
454
721
|
let ordered = data.sorted(comparator);
|
|
455
722
|
```
|
|
456
723
|
|
|
457
724
|
### 选择窗口收集器(窗口操作)
|
|
458
|
-
|
|
459
725
|
```typescript
|
|
460
726
|
// 当需要窗口操作时
|
|
461
727
|
let window: WindowCollectable<number> = data
|
|
@@ -464,23 +730,24 @@ let window: WindowCollectable<number> = data
|
|
|
464
730
|
```
|
|
465
731
|
|
|
466
732
|
### 选择统计分析(数值计算)
|
|
467
|
-
|
|
468
733
|
```typescript
|
|
469
734
|
// 当需要统计分析时
|
|
470
735
|
let statistics: NumericStatistics<number> = data
|
|
471
|
-
.toNumericStatistics(); //
|
|
736
|
+
.toNumericStatistics(); // 数字统计
|
|
737
|
+
|
|
472
738
|
let bigIntStatistics: BigintStatistics<bigint> = data
|
|
473
739
|
.toBigintStatistics(); // 大整数统计
|
|
474
740
|
```
|
|
475
741
|
|
|
476
|
-
|
|
477
|
-
|
|
742
|
+
https://github.com/eloyhere/semantic-typescript
|
|
743
|
+
https://www.npmjs.com/package/semantic-typescript
|
|
744
|
+
|
|
745
|
+
## 重要说明
|
|
478
746
|
|
|
479
|
-
|
|
747
|
+
1. **排序操作的影响**:在有序收集器中,`sorted()` 操作会覆盖 `redirect`、`translate`、`shuffle`、`reverse` 的效果。
|
|
748
|
+
2. **性能考量**:如果不需要顺序保证,优先使用 `toUnoredered()` 以获得更好的性能。
|
|
749
|
+
3. **内存使用**:排序操作需要 O(n) 的额外空间。
|
|
750
|
+
4. **实时数据**:Semantic 流适用于处理实时数据,并支持异步数据源。
|
|
480
751
|
|
|
481
|
-
1. **排序操作的影响**:在有序收集器中,`sorted()` 操作会覆盖 `redirect`、`translate`、`shuffle`、`reverse` 的效果。
|
|
482
|
-
2. **性能考虑**:如果不需要顺序保证,优先使用 `toUnordered()` 以获得更好的性能。
|
|
483
|
-
3. **内存使用**:排序操作需要额外的 O(n) 空间。
|
|
484
|
-
4. **实时数据处理**:Semantic 流适用于处理实时数据,并支持异步数据源。
|
|
485
752
|
|
|
486
|
-
这个库为 TypeScript
|
|
753
|
+
这个库为 TypeScript 开发者提供了强大而灵活的流式处理能力,结合了函数式编程的优势和类型安全的保证。
|