semantic-typescript 0.0.8 → 0.1.4
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/semantic.d.ts +22 -5
- package/dist/semantic.js +106 -52
- package/package.json +53 -8
- package/readme.cn.md +343 -446
- package/readme.de.md +341 -443
- package/readme.es.md +342 -443
- package/readme.fr.md +345 -446
- package/readme.jp.md +346 -448
- package/readme.kr.md +350 -452
- package/readme.md +345 -448
- package/readme.ru.md +347 -448
- package/readme.tw.md +340 -443
package/readme.jp.md
CHANGED
|
@@ -1,529 +1,427 @@
|
|
|
1
|
-
# Semantic-TypeScript
|
|
1
|
+
# Semantic-TypeScript ストリーム処理ライブラリ
|
|
2
2
|
|
|
3
|
-
##
|
|
3
|
+
## 概要
|
|
4
4
|
|
|
5
|
-
Semantic-TypeScriptは、JavaScript
|
|
5
|
+
Semantic-TypeScriptは、JavaScript GeneratorFunction、Java Stream、MySQL Indexにインスパイアされたモダンなストリーム処理ライブラリです。このライブラリのコア設計は、データインデックスに基づいた効率的なデータ処理パイプラインの構築にあり、型安全で関数型スタイルのストリーム操作体験をフロントエンド開発者に提供します。
|
|
6
6
|
|
|
7
|
-
従来の同期処理とは異なり、Semantic
|
|
7
|
+
従来の同期処理とは異なり、Semanticは非同期処理モードを採用しています。データストリームを作成する際、端末がデータを受信するタイミングは、アップストリームが`accept`および`interrupt`コールバック関数をいつ呼び出すかに完全に依存します。この設計により、ライブラリはリアルタイムデータストリーム、大規模データセット、非同期データソースを優雅に処理できます。
|
|
8
8
|
|
|
9
|
-
##
|
|
9
|
+
## インストール
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
| **関数型プログラミング** | 不変データ構造と純粋関数 | 予測可能なコード、テストと保守が容易 |
|
|
15
|
-
| **遅延評価** | オンデマンド計算、パフォーマンス最適化 | 大規模データセット処理時の高いメモリ効率 |
|
|
16
|
-
| **非同期ストリーム処理** | ジェネレータベースの非同期データストリーム | リアルタイムデータとイベント駆動シナリオに適応 |
|
|
17
|
-
| **マルチパラダイムコレクター** | 順序付き、順序なし、統計的収集戦略 | 異なるシナリオに基づく最適な戦略選択 |
|
|
18
|
-
| **統計分析** | 組み込みの完全な統計計算関数 | 統合データ分析とレポート生成 |
|
|
19
|
-
|
|
20
|
-
## パフォーマンスに関する考慮事項
|
|
21
|
-
|
|
22
|
-
**重要な注意**: 以下のメソッドは、データを収集してソートするため、パフォーマンスを犠牲にして順序付きデータコレクションを生成します:
|
|
23
|
-
- `toOrdered()`
|
|
24
|
-
- `toWindow()`
|
|
25
|
-
- `toNumericStatistics()`
|
|
26
|
-
- `toBigIntStatistics()`
|
|
27
|
-
- `sorted()`
|
|
28
|
-
- `sorted(comparator)`
|
|
29
|
-
|
|
30
|
-
特に重要な注意点: `sorted()`および`sorted(comparator)`は、以下のメソッドの結果を上書きします:
|
|
31
|
-
- `redirect(redirector)`
|
|
32
|
-
- `translate(translator)`
|
|
33
|
-
- `shuffle(mapper)`
|
|
34
|
-
|
|
35
|
-
## ファクトリメソッド
|
|
36
|
-
|
|
37
|
-
### ストリーム作成ファクトリ
|
|
11
|
+
```bash
|
|
12
|
+
npm install semantic-typescript
|
|
13
|
+
```
|
|
38
14
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
|
42
|
-
|
|
43
|
-
| `
|
|
44
|
-
| `
|
|
45
|
-
| `
|
|
46
|
-
| `
|
|
47
|
-
| `
|
|
15
|
+
## 基本型
|
|
16
|
+
|
|
17
|
+
| 型 | 説明 |
|
|
18
|
+
|----|------|
|
|
19
|
+
| `Invalid<T>` | nullまたはundefinedを拡張する型 |
|
|
20
|
+
| `Valid<T>` | nullとundefinedを除外する型 |
|
|
21
|
+
| `MaybeInvalid<T>` | nullまたはundefinedになり得る型 |
|
|
22
|
+
| `Primitive` | プリミティブ型のコレクション |
|
|
23
|
+
| `MaybePrimitive<T>` | プリミティブ型になり得る型 |
|
|
24
|
+
| `OptionalSymbol` | Optionalクラスのシンボル識別子 |
|
|
25
|
+
| `SemanticSymbol` | Semanticクラスのシンボル識別子 |
|
|
26
|
+
| `CollectorsSymbol` | Collectorクラスのシンボル識別子 |
|
|
27
|
+
| `CollectableSymbol` | Collectableクラスのシンボル識別子 |
|
|
28
|
+
| `OrderedCollectableSymbol` | OrderedCollectableクラスのシンボル識別子 |
|
|
29
|
+
| `WindowCollectableSymbol` | WindowCollectableクラスのシンボル識別子 |
|
|
30
|
+
| `StatisticsSymbol` | Statisticsクラスのシンボル識別子 |
|
|
31
|
+
| `NumericStatisticsSymbol` | NumericStatisticsクラスのシンボル識別子 |
|
|
32
|
+
| `BigIntStatisticsSymbol` | BigIntStatisticsクラスのシンボル識別子 |
|
|
33
|
+
| `UnorderedCollectableSymbol` | UnorderedCollectableクラスのシンボル識別子 |
|
|
34
|
+
| `Runnable` | パラメータなし、戻り値なしの関数 |
|
|
35
|
+
| `Supplier<R>` | パラメータなしでRを返す関数 |
|
|
36
|
+
| `Functional<T, R>` | 単一パラメータ変換関数 |
|
|
37
|
+
| `Predicate<T>` | 単一パラメータ述語関数 |
|
|
38
|
+
| `BiFunctional<T, U, R>` | 二重パラメータ変換関数 |
|
|
39
|
+
| `BiPredicate<T, U>` | 二重パラメータ述語関数 |
|
|
40
|
+
| `Comparator<T>` | 比較関数 |
|
|
41
|
+
| `TriFunctional<T, U, V, R>` | 三重パラメータ変換関数 |
|
|
42
|
+
| `Consumer<T>` | 単一パラメータ消費関数 |
|
|
43
|
+
| `BiConsumer<T, U>` | 二重パラメータ消費関数 |
|
|
44
|
+
| `TriConsumer<T, U, V>` | 三重パラメータ消費関数 |
|
|
45
|
+
| `Generator<T>` | ジェネレーター関数 |
|
|
48
46
|
|
|
49
|
-
**コード例補足:**
|
|
50
47
|
```typescript
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
const
|
|
55
|
-
|
|
56
|
-
// 数値範囲ストリーム作成
|
|
57
|
-
const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
58
|
-
|
|
59
|
-
// 繰り返し要素で埋め立て
|
|
60
|
-
const filledStream = fill("hello", 3n); // "hello", "hello", "hello"
|
|
61
|
-
|
|
62
|
-
// 空のストリーム作成
|
|
63
|
-
const emptyStream = empty<number>();
|
|
48
|
+
// 型使用例
|
|
49
|
+
const predicate: Predicate<number> = (n) => n > 0;
|
|
50
|
+
const mapper: Functional<string, number> = (str) => str.length;
|
|
51
|
+
const comparator: Comparator<number> = (a, b) => a - b;
|
|
64
52
|
```
|
|
65
53
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
|
69
|
-
|
|
70
|
-
| `validate
|
|
71
|
-
| `invalidate
|
|
72
|
-
| `
|
|
73
|
-
| `
|
|
54
|
+
## 型ガード
|
|
55
|
+
|
|
56
|
+
| 関数 | 説明 | 時間計算量 | 空間計算量 |
|
|
57
|
+
|------|------|------------|------------|
|
|
58
|
+
| `validate<T>(t: MaybeInvalid<T>): t is T` | 値がnullまたはundefinedでないことを検証 | O(1) | O(1) |
|
|
59
|
+
| `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | 値がnullまたはundefinedであることを検証 | O(1) | O(1) |
|
|
60
|
+
| `isBoolean(t: unknown): t is boolean` | ブーリアンかどうかチェック | O(1) | O(1) |
|
|
61
|
+
| `isString(t: unknown): t is string` | 文字列かどうかチェック | O(1) | O(1) |
|
|
62
|
+
| `isNumber(t: unknown): t is number` | 数値かどうかチェック | O(1) | O(1) |
|
|
63
|
+
| `isFunction(t: unknown): t is Function` | 関数かどうかチェック | O(1) | O(1) |
|
|
64
|
+
| `isObject(t: unknown): t is object` | オブジェクトかどうかチェック | O(1) | O(1) |
|
|
65
|
+
| `isSymbol(t: unknown): t is symbol` | シンボルかどうかチェック | O(1) | O(1) |
|
|
66
|
+
| `isBigint(t: unknown): t is bigint` | BigIntかどうかチェック | O(1) | O(1) |
|
|
67
|
+
| `isPrimitive(t: unknown): t is Primitive` | プリミティブ型かどうかチェック | O(1) | O(1) |
|
|
68
|
+
| `isIterable(t: unknown): t is Iterable<unknown>` | 反復可能かどうかチェック | O(1) | O(1) |
|
|
69
|
+
| `isOptional(t: unknown): t is Optional<unknown>` | Optionalインスタンスかどうかチェック | O(1) | O(1) |
|
|
70
|
+
| `isSemantic(t: unknown): t is Semantic<unknown>` | Semanticインスタンスかどうかチェック | O(1) | O(1) |
|
|
71
|
+
| `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | Collectorインスタンスかどうかチェック | O(1) | O(1) |
|
|
72
|
+
| `isCollectable(t: unknown): t is Collectable<unknown>` | Collectableインスタンスかどうかチェック | O(1) | O(1) |
|
|
73
|
+
| `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | OrderedCollectableインスタンスかどうかチェック | O(1) | O(1) |
|
|
74
|
+
| `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | WindowCollectableインスタンスかどうかチェック | O(1) | O(1) |
|
|
75
|
+
| `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | UnorderedCollectableインスタンスかどうかチェック | O(1) | O(1) |
|
|
76
|
+
| `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | Statisticsインスタンスかどうかチェック | O(1) | O(1) |
|
|
77
|
+
| `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | NumericStatisticsインスタンスかどうかチェック | O(1) | O(1) |
|
|
78
|
+
| `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | BigIntStatisticsインスタンスかどうかチェック | O(1) | O(1) |
|
|
74
79
|
|
|
75
|
-
**コード例補足:**
|
|
76
80
|
```typescript
|
|
77
|
-
|
|
81
|
+
// 型ガード使用例
|
|
82
|
+
const value: unknown = "hello";
|
|
78
83
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
if (validate(data)) {
|
|
82
|
-
console.log(data.toUpperCase()); // validateがデータがnullでないことを保証するため安全な呼び出し
|
|
84
|
+
if (isString(value)) {
|
|
85
|
+
console.log(value.length); // 型安全、valueはstringと推論
|
|
83
86
|
}
|
|
84
87
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
console.log("データが無効です"); // invalidateがnullを検出したため実行される
|
|
88
|
+
if (isOptional(someValue)) {
|
|
89
|
+
someValue.ifPresent(val => console.log(val));
|
|
88
90
|
}
|
|
89
|
-
|
|
90
|
-
// 値の比較
|
|
91
|
-
const comparison = useCompare("apple", "banana"); // -1
|
|
92
|
-
|
|
93
|
-
// 乱数生成
|
|
94
|
-
const randomNum = useRandom(42); // シード42に基づく乱数
|
|
95
91
|
```
|
|
96
92
|
|
|
97
|
-
##
|
|
98
|
-
|
|
99
|
-
### Optional<T> - 安全なnull値処理
|
|
100
|
-
|
|
101
|
-
Optionalクラスは、nullまたはundefinedになる可能性のある値を安全に扱うための関数型アプローチを提供します。
|
|
93
|
+
## ユーティリティ関数
|
|
102
94
|
|
|
103
|
-
|
|
|
104
|
-
|
|
105
|
-
| `
|
|
106
|
-
| `
|
|
107
|
-
| `getOrDefault(defaultValue: T)` | `T` | 値またはデフォルト値を取得 | O(1) |
|
|
108
|
-
| `ifPresent(action: Consumer<T>)` | `void` | 値が存在する場合にアクションを実行 | O(1) |
|
|
109
|
-
| `isEmpty()` | `boolean` | 空かどうかチェック | O(1) |
|
|
110
|
-
| `isPresent()` | `boolean` | 値が存在するかチェック | O(1) |
|
|
111
|
-
| `map<R>(mapper: Functional<T, R>)` | `Optional<R>` | 値のマッピングと変換 | O(1) |
|
|
112
|
-
| `static of<T>(value: MaybeInvalid<T>)` | `Optional<T>` | Optionalインスタンスを作成 | O(1) |
|
|
113
|
-
| `static ofNullable<T>(value?)` | `Optional<T>` | null許容Optionalを作成 | O(1) |
|
|
114
|
-
| `static ofNonNull<T>(value: T)` | `Optional<T>` | non-null Optionalを作成 | O(1) |
|
|
95
|
+
| 関数 | 説明 | 時間計算量 | 空間計算量 |
|
|
96
|
+
|------|------|------------|------------|
|
|
97
|
+
| `useCompare<T>(t1: T, t2: T): number` | 汎用比較関数 | O(1) | O(1) |
|
|
98
|
+
| `useRandom<T = number \| bigint>(index: T): T` | 擬似乱数生成器 | O(log n) | O(1) |
|
|
115
99
|
|
|
116
|
-
**コード例補足:**
|
|
117
100
|
```typescript
|
|
118
|
-
|
|
101
|
+
// ユーティリティ関数使用例
|
|
102
|
+
const numbers = [3, 1, 4, 1, 5];
|
|
103
|
+
numbers.sort(useCompare); // [1, 1, 3, 4, 5]
|
|
119
104
|
|
|
120
|
-
//
|
|
121
|
-
const
|
|
105
|
+
const randomNum = useRandom(42); // シードベースの乱数
|
|
106
|
+
const randomBigInt = useRandom(1000n); // BigInt乱数
|
|
107
|
+
```
|
|
122
108
|
|
|
123
|
-
|
|
124
|
-
const result = optionalValue
|
|
125
|
-
.filter(val => val.length > 3) // 長さが3より大きい値をフィルタリング
|
|
126
|
-
.map(val => val.toUpperCase()) // 大文字に変換
|
|
127
|
-
.getOrDefault("default"); // 値またはデフォルト値を取得
|
|
109
|
+
## ファクトリメソッド
|
|
128
110
|
|
|
129
|
-
|
|
111
|
+
### Optionalファクトリメソッド
|
|
130
112
|
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
113
|
+
| メソッド | 説明 | 時間計算量 | 空間計算量 |
|
|
114
|
+
|---------|------|------------|------------|
|
|
115
|
+
| `Optional.empty<T>()` | 空のOptionalを作成 | O(1) | O(1) |
|
|
116
|
+
| `Optional.of<T>(value)` | 値を持つOptionalを作成 | O(1) | O(1) |
|
|
117
|
+
| `Optional.ofNullable<T>(value)` | null許容Optionalを作成 | O(1) | O(1) |
|
|
118
|
+
| `Optional.ofNonNull<T>(value)` | 非nullOptionalを作成 | O(1) | O(1) |
|
|
135
119
|
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
120
|
+
```typescript
|
|
121
|
+
// Optional使用例
|
|
122
|
+
const emptyOpt = Optional.empty<number>();
|
|
123
|
+
const presentOpt = Optional.of(42);
|
|
124
|
+
const nullableOpt = Optional.ofNullable<string>(null);
|
|
125
|
+
const nonNullOpt = Optional.ofNonNull("hello");
|
|
126
|
+
|
|
127
|
+
presentOpt.ifPresent(val => console.log(val)); // 42を出力
|
|
128
|
+
console.log(emptyOpt.orElse(100)); // 100を出力
|
|
142
129
|
```
|
|
143
130
|
|
|
144
|
-
###
|
|
145
|
-
|
|
146
|
-
Semanticは、豊富なストリーム演算子を提供するコアのストリーム処理クラスです。
|
|
147
|
-
|
|
148
|
-
#### ストリーム変換操作
|
|
149
|
-
|
|
150
|
-
| メソッド | 戻り値の型 | 説明 | パフォーマンス影響 |
|
|
151
|
-
|------|----------|------|----------|
|
|
152
|
-
| `concat(other: Semantic<E>)` | `Semantic<E>` | 2つのストリームを連結 | O(n+m) |
|
|
153
|
-
| `distinct()` | `Semantic<E>` | 重複を削除(Set使用) | O(n) |
|
|
154
|
-
| `distinct(comparator)` | `Semantic<E>` | カスタム比較子で重複削除 | O(n²) |
|
|
155
|
-
| `dropWhile(predicate)` | `Semantic<E>` | 条件を満たす先頭要素を破棄 | O(n) |
|
|
156
|
-
| `filter(predicate)` | `Semantic<E>` | 要素をフィルタリング | O(n) |
|
|
157
|
-
| `flat(mapper)` | `Semantic<E>` | ネストしたストリームを平坦化 | O(n×m) |
|
|
158
|
-
| `flatMap(mapper)` | `Semantic<R>` | マッピングと平坦化 | O(n×m) |
|
|
159
|
-
| `limit(n)` | `Semantic<E>` | 要素数を制限 | O(n) |
|
|
160
|
-
| `map(mapper)` | `Semantic<R>` | 要素のマッピングと変換 | O(n) |
|
|
161
|
-
| `peek(consumer)` | `Semantic<E>` | 要素を変更せずに閲覧 | O(n) |
|
|
162
|
-
| `redirect(redirector)` | `Semantic<E>` | インデックスのリダイレクト | O(n) |
|
|
163
|
-
| `reverse()` | `Semantic<E>` | ストリーム順序を反転 | O(n) |
|
|
164
|
-
| `shuffle()` | `Semantic<E>` | ランダムにシャッフル | O(n) |
|
|
165
|
-
| `shuffle(mapper)` | `Semantic<E>` | カスタムシャッフルロジック | O(n) |
|
|
166
|
-
| `skip(n)` | `Semantic<E>` | 最初のn要素をスキップ | O(n) |
|
|
167
|
-
| `sub(start, end)` | `Semantic<E>` | サブストリームを取得 | O(n) |
|
|
168
|
-
| `takeWhile(predicate)` | `Semantic<E>` | 条件を満たす先頭要素を取得 | O(n) |
|
|
169
|
-
| `translate(offset)` | `Semantic<E>` | インデックスの平行移動 | O(n) |
|
|
170
|
-
| `translate(translator)` | `Semantic<E>` | カスタムインデックス変換 | O(n) |
|
|
171
|
-
|
|
172
|
-
**コード例補足:**
|
|
173
|
-
```typescript
|
|
174
|
-
import { from } from 'semantic-typescript';
|
|
131
|
+
### Collectorファクトリメソッド
|
|
175
132
|
|
|
176
|
-
|
|
133
|
+
| メソッド | 説明 | 時間計算量 | 空間計算量 |
|
|
134
|
+
|---------|------|------------|------------|
|
|
135
|
+
| `Collector.full(identity, accumulator, finisher)` | 完全なコレクターを作成 | O(1) | O(1) |
|
|
136
|
+
| `Collector.shortable(identity, interruptor, accumulator, finisher)` | 中断可能なコレクターを作成 | O(1) | O(1) |
|
|
177
137
|
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
138
|
+
```typescript
|
|
139
|
+
// Collector使用例
|
|
140
|
+
const sumCollector = Collector.full(
|
|
141
|
+
() => 0,
|
|
142
|
+
(sum, num) => sum + num,
|
|
143
|
+
result => result
|
|
144
|
+
);
|
|
185
145
|
|
|
186
|
-
|
|
146
|
+
const numbers = from([1, 2, 3, 4, 5]);
|
|
147
|
+
const total = numbers.toUnoredered().collect(sumCollector); // 15
|
|
187
148
|
```
|
|
188
149
|
|
|
189
|
-
|
|
150
|
+
### Semanticファクトリメソッド
|
|
190
151
|
|
|
191
|
-
| メソッド |
|
|
192
|
-
|
|
193
|
-
| `
|
|
194
|
-
| `
|
|
195
|
-
| `
|
|
196
|
-
| `
|
|
197
|
-
| `
|
|
198
|
-
| `
|
|
199
|
-
| `
|
|
152
|
+
| メソッド | 説明 | 時間計算量 | 空間計算量 |
|
|
153
|
+
|---------|------|------------|------------|
|
|
154
|
+
| `blob(blob, chunkSize)` | Blobからストリームを生成 | O(n) | O(chunkSize) |
|
|
155
|
+
| `empty<E>()` | 空のストリームを生成 | O(1) | O(1) |
|
|
156
|
+
| `fill<E>(element, count)` | 埋め尽くされたストリームを生成 | O(n) | O(1) |
|
|
157
|
+
| `from<E>(iterable)` | 反復可能オブジェクトからストリームを生成 | O(1) | O(1) |
|
|
158
|
+
| `interval(period, delay?)` | 定期的なインターバルストリームを生成 | O(1)* | O(1) |
|
|
159
|
+
| `iterate<E>(generator)` | ジェネレータからストリームを生成 | O(1) | O(1) |
|
|
160
|
+
| `range(start, end, step)` | 数値範囲ストリームを生成 | O(n) | O(1) |
|
|
161
|
+
| `websocket(websocket)` | WebSocketからストリームを生成 | O(1) | O(1) |
|
|
200
162
|
|
|
201
|
-
**コード例補足:**
|
|
202
163
|
```typescript
|
|
203
|
-
|
|
164
|
+
// Semanticファクトリメソッドの使用例
|
|
204
165
|
|
|
205
|
-
|
|
166
|
+
// Blobからストリームを作成(チャンク読み込み)
|
|
167
|
+
blob(someBlob, 1024n)
|
|
168
|
+
.toUnordered()
|
|
169
|
+
.write(WritableStream)
|
|
170
|
+
.then(callback) // ストリーム書き込み成功
|
|
171
|
+
.catch(writeFi); // ストリーム書き込み失敗
|
|
206
172
|
|
|
207
|
-
//
|
|
208
|
-
|
|
173
|
+
// 他のストリームと連結されるまで実行されない空ストリームを作成
|
|
174
|
+
empty<string>()
|
|
175
|
+
.toUnordered()
|
|
176
|
+
.join(); //[]
|
|
209
177
|
|
|
210
|
-
//
|
|
211
|
-
const
|
|
178
|
+
// 埋め尽くされたストリームを作成
|
|
179
|
+
const filledStream = fill("hello", 3); // "hello", "hello", "hello"
|
|
212
180
|
|
|
213
|
-
//
|
|
214
|
-
|
|
181
|
+
// 初期遅延2秒、実行周期5秒の時系列ストリームを作成
|
|
182
|
+
// タイマーメカニズムで実装、システムスケジューリング制限による時間変動の可能性あり
|
|
183
|
+
const intervalStream = interval(5000, 2000);
|
|
215
184
|
|
|
216
|
-
//
|
|
217
|
-
const
|
|
185
|
+
// 反復可能オブジェクトからストリームを作成
|
|
186
|
+
const numberStream = from([1, 2, 3, 4, 5]);
|
|
187
|
+
const stringStream = from(new Set(["Alex", "Bob"]));
|
|
218
188
|
|
|
219
|
-
//
|
|
220
|
-
const
|
|
189
|
+
// 範囲ストリームを作成
|
|
190
|
+
const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
221
191
|
|
|
222
|
-
//
|
|
192
|
+
// WebSocketイベントストリーム
|
|
193
|
+
const ws = new WebSocket("ws://localhost:8080");
|
|
194
|
+
websocket(ws)
|
|
195
|
+
.filter((event)=> event.type === "message") // メッセージイベントのみ監視
|
|
196
|
+
.toUnordered() // イベントは通常ソート不要
|
|
197
|
+
.forEach((event)=> receive(event)); // メッセージ受信
|
|
223
198
|
```
|
|
224
199
|
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
200
|
+
## Semanticクラスメソッド
|
|
201
|
+
|
|
202
|
+
| メソッド | 説明 | 時間計算量 | 空間計算量 |
|
|
203
|
+
|---------|------|------------|------------|
|
|
204
|
+
| `concat(other)` | 二つのストリームを連結 | O(n) | O(1) |
|
|
205
|
+
| `distinct()` | 重複排除 | O(n) | O(n) |
|
|
206
|
+
| `distinct(comparator)` | コンパレーターを使用した重複排除 | O(n²) | O(n) |
|
|
207
|
+
| `dropWhile(predicate)` | 条件を満たす要素を破棄 | O(n) | O(1) |
|
|
208
|
+
| `filter(predicate)` | 要素のフィルタリング | O(n) | O(1) |
|
|
209
|
+
| `flat(mapper)` | フラットマッピング | O(n × m) | O(1) |
|
|
210
|
+
| `flatMap(mapper)` | 新しい型へのフラットマッピング | O(n × m) | O(1) |
|
|
211
|
+
| `limit(n)` | 要素数の制限 | O(n) | O(1) |
|
|
212
|
+
| `map(mapper)` | マッピング変換 | O(n) | O(1) |
|
|
213
|
+
| `peek(consumer)` | 要素の検査 | O(n) | O(1) |
|
|
214
|
+
| `redirect(redirector)` | インデックスのリダイレクト | O(n) | O(1) |
|
|
215
|
+
| `reverse()` | ストリームの反転 | O(n) | O(1) |
|
|
216
|
+
| `shuffle()` | ランダムシャッフル | O(n) | O(1) |
|
|
217
|
+
| `shuffle(mapper)` | マッパーを使用したシャッフル | O(n) | O(1) |
|
|
218
|
+
| `skip(n)` | 最初のn要素をスキップ | O(n) | O(1) |
|
|
219
|
+
| `sorted()` | ソート | O(n log n) | O(n) |
|
|
220
|
+
| `sorted(comparator)` | コンパレーターを使用したソート | O(n log n) | O(n) |
|
|
221
|
+
| `sub(start, end)` | サブストリームの取得 | O(n) | O(1) |
|
|
222
|
+
| `takeWhile(predicate)` | 条件を満たす要素を取得 | O(n) | O(1) |
|
|
223
|
+
| `translate(offset)` | インデックスの平行移動 | O(n) | O(1) |
|
|
224
|
+
| `translate(translator)` | トランスレーターを使用した平行移動 | O(n) | O(1) |
|
|
228
225
|
|
|
229
|
-
| メソッド | 説明 | 使用シナリオ |
|
|
230
|
-
|------|------|----------|
|
|
231
|
-
| `collect(generator)` | データ収集を実行 | ストリーム終端操作 |
|
|
232
|
-
| `static full(identity, accumulator, finisher)` | 完全なコレクターを作成 | 完全な処理が必要 |
|
|
233
|
-
| `static shortable(identity, interruptor, accumulator, finisher)` | 中断可能なコレクターを作成 | 早期終了する可能性あり |
|
|
234
|
-
|
|
235
|
-
**コード例補足:**
|
|
236
226
|
```typescript
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
//
|
|
240
|
-
|
|
241
|
-
()
|
|
242
|
-
(
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
//
|
|
247
|
-
const
|
|
248
|
-
|
|
227
|
+
// Semantic操作例
|
|
228
|
+
const result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
229
|
+
.filter(n => n % 2 === 0) // 偶数のフィルタリング
|
|
230
|
+
.map(n => n * 2) // 2倍に変換
|
|
231
|
+
.skip(1) // 最初の要素をスキップ
|
|
232
|
+
.limit(3) // 3要素に制限
|
|
233
|
+
.toArray(); // 配列に変換
|
|
234
|
+
// 結果: [8, 12, 20]
|
|
235
|
+
|
|
236
|
+
// 複雑な操作例
|
|
237
|
+
const complexResult = range(1, 100, 1)
|
|
238
|
+
.flatMap(n => from([n, n * 2])) // 各要素を2要素にマッピング
|
|
239
|
+
.distinct() // 重複排除
|
|
240
|
+
.shuffle() // ランダムシャッフル
|
|
241
|
+
.takeWhile(n => n < 50) // 50未満の要素を取得
|
|
242
|
+
.toOrdered() // 順序付きコレクターに変換
|
|
243
|
+
.toArray(); // 配列に変換
|
|
249
244
|
```
|
|
250
245
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
豊富なデータ集約および変換メソッドを提供します。**注: 最初にSemanticインスタンスを通じてsorted()、toOrdered()などを呼び出してCollectableインスタンスを取得してから、以下のメソッドを使用する必要があります。**
|
|
246
|
+
## コレクター変換メソッド
|
|
254
247
|
|
|
255
|
-
|
|
248
|
+
| メソッド | 説明 | 時間計算量 | 空間計算量 |
|
|
249
|
+
|---------|------|------------|------------|
|
|
250
|
+
| `toUnoredered()` | 非順序コレクターに変換(パフォーマンス優先) | O(1) | O(1) |
|
|
251
|
+
| `toOrdered()` | 順序付きコレクターに変換 | O(1) | O(1) |
|
|
252
|
+
| `sorted()` | ソートして順序付きコレクターに変換 | O(n log n) | O(n) |
|
|
253
|
+
| `toWindow()` | ウィンドウコレクターに変換 | O(1) | O(1) |
|
|
254
|
+
| `toNumericStatistics()` | 数値統計に変換 | O(1) | O(1) |
|
|
255
|
+
| `toBigintStatistics()` | BigInt統計に変換 | O(1) | O(1) |
|
|
256
256
|
|
|
257
|
-
| メソッド | 戻り値の型 | 説明 | 例 |
|
|
258
|
-
|------|----------|------|------|
|
|
259
|
-
| `anyMatch(predicate)` | `boolean` | いずれかの要素が条件に一致するか | `anyMatch(x => x > 0)` |
|
|
260
|
-
| `allMatch(predicate)` | `boolean` | すべての要素が条件に一致するか | `allMatch(x => x > 0)` |
|
|
261
|
-
| `count()` | `bigint` | 要素数の統計 | `count()` → `5n` |
|
|
262
|
-
| `isEmpty()` | `boolean` | ストリームが空かどうか | `isEmpty()` |
|
|
263
|
-
| `findAny()` | `Optional<E>` | 任意の要素を検索 | `findAny()` |
|
|
264
|
-
| `findFirst()` | `Optional<E>` | 最初の要素を検索 | `findFirst()` |
|
|
265
|
-
| `findLast()` | `Optional<E>` | 最後の要素を検索 | `findLast()` |
|
|
266
|
-
|
|
267
|
-
**コード例補足:**
|
|
268
257
|
```typescript
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
const
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
258
|
+
// コレクター変換例
|
|
259
|
+
const numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
|
|
260
|
+
|
|
261
|
+
// パフォーマンス優先:非順序コレクターを使用
|
|
262
|
+
const unordered = numbers
|
|
263
|
+
.filter(n => n > 3)
|
|
264
|
+
.toUnoredered();
|
|
265
|
+
|
|
266
|
+
// ソート必要:順序付きコレクターを使用
|
|
267
|
+
const ordered = numbers
|
|
268
|
+
.sorted()
|
|
269
|
+
.toOrdered();
|
|
270
|
+
|
|
271
|
+
// 統計分析:統計コレクターを使用
|
|
272
|
+
const stats = numbers
|
|
273
|
+
.toNumericStatistics();
|
|
274
|
+
|
|
275
|
+
console.log(stats.mean()); // 平均値
|
|
276
|
+
console.log(stats.median()); // 中央値
|
|
277
|
+
console.log(stats.standardDeviation()); // 標準偏差
|
|
278
|
+
|
|
279
|
+
// ウィンドウ操作
|
|
280
|
+
const windowed = numbers
|
|
281
|
+
.toWindow()
|
|
282
|
+
.tumble(3n); // 3要素ごとのウィンドウ
|
|
283
|
+
|
|
284
|
+
windowed.forEach(window => {
|
|
285
|
+
console.log(window.toArray()); // 各ウィンドウの内容
|
|
286
|
+
});
|
|
283
287
|
```
|
|
284
288
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
| メソッド |
|
|
288
|
-
|
|
289
|
-
| `
|
|
290
|
-
| `
|
|
291
|
-
| `
|
|
292
|
-
| `
|
|
293
|
-
| `
|
|
294
|
-
| `
|
|
295
|
-
| `
|
|
296
|
-
| `
|
|
297
|
-
| `
|
|
298
|
-
| `
|
|
299
|
-
| `
|
|
300
|
-
|
|
301
|
-
|
|
289
|
+
## Collectable収集メソッド
|
|
290
|
+
|
|
291
|
+
| メソッド | 説明 | 時間計算量 | 空間計算量 |
|
|
292
|
+
|---------|------|------------|------------|
|
|
293
|
+
| `anyMatch(predicate)` | 一致する要素が存在するかチェック | O(n) | O(1) |
|
|
294
|
+
| `allMatch(predicate)` | すべての要素が一致するかチェック | O(n) | O(1) |
|
|
295
|
+
| `count()` | 要素のカウント | O(n) | O(1) |
|
|
296
|
+
| `isEmpty()` | 空かどうかチェック | O(1) | O(1) |
|
|
297
|
+
| `findAny()` | 任意の要素を検索 | O(n) | O(1) |
|
|
298
|
+
| `findFirst()` | 最初の要素を検索 | O(n) | O(1) |
|
|
299
|
+
| `findLast()` | 最後の要素を検索 | O(n) | O(1) |
|
|
300
|
+
| `forEach(action)` | 全要素の反復処理 | O(n) | O(1) |
|
|
301
|
+
| `group(classifier)` | 分類器によるグループ化 | O(n) | O(n) |
|
|
302
|
+
| `groupBy(keyExtractor, valueExtractor)` | キー値抽出器によるグループ化 | O(n) | O(n) |
|
|
303
|
+
| `join()` | 文字列への結合 | O(n) | O(n) |
|
|
304
|
+
| `join(delimiter)` | 区切り文字を使用した結合 | O(n) | O(n) |
|
|
305
|
+
| `nonMatch(predicate)` | 一致する要素がないかチェック | O(n) | O(1) |
|
|
306
|
+
| `partition(count)` | 数量による分割 | O(n) | O(n) |
|
|
307
|
+
| `partitionBy(classifier)` | 分類器による分割 | O(n) | O(n) |
|
|
308
|
+
| `reduce(accumulator)` | 縮約操作 | O(n) | O(1) |
|
|
309
|
+
| `reduce(identity, accumulator)` | 初期値付き縮約 | O(n) | O(1) |
|
|
310
|
+
| `toArray()` | 配列への変換 | O(n) | O(n) |
|
|
311
|
+
| `toMap(keyExtractor, valueExtractor)` | Mapへの変換 | O(n) | O(n) |
|
|
312
|
+
| `toSet()` | Setへの変換 | O(n) | O(n) |
|
|
313
|
+
| `write(stream)` | ストリームへの書き込み | O(n) | O(1) |
|
|
314
|
+
|
|
302
315
|
```typescript
|
|
303
|
-
|
|
316
|
+
// Collectable操作例
|
|
317
|
+
const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
318
|
+
.filter(n => n % 2 === 0)
|
|
319
|
+
.toOrdered();
|
|
304
320
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
{ name: "Charlie", age: 25, city: "New York" }
|
|
309
|
-
]);
|
|
321
|
+
// 一致チェック
|
|
322
|
+
console.log(data.anyMatch(n => n > 5)); // true
|
|
323
|
+
console.log(data.allMatch(n => n < 20)); // true
|
|
310
324
|
|
|
311
|
-
//
|
|
312
|
-
|
|
325
|
+
// 検索操作
|
|
326
|
+
data.findFirst().ifPresent(n => console.log(n)); // 2
|
|
327
|
+
data.findAny().ifPresent(n => console.log(n)); // 任意の要素
|
|
313
328
|
|
|
314
329
|
// グループ化操作
|
|
315
|
-
const
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
const byAge = collectable.groupBy(
|
|
319
|
-
person => person.age,
|
|
320
|
-
person => person.name
|
|
330
|
+
const grouped = data.groupBy(
|
|
331
|
+
n => n > 5 ? "large" : "small",
|
|
332
|
+
n => n * 2
|
|
321
333
|
);
|
|
322
|
-
//
|
|
323
|
-
|
|
324
|
-
// コレクションに変換
|
|
325
|
-
const array = collectable.toArray(); // 元の配列
|
|
326
|
-
const set = collectable.toSet(); // Setコレクション
|
|
327
|
-
const map = collectable.toMap(
|
|
328
|
-
person => person.name,
|
|
329
|
-
person => person.age
|
|
330
|
-
); // Map { "Alice" => 25, "Bob" => 30, "Charlie" => 25 }
|
|
334
|
+
// {small: [4, 8], large: [12, 16, 20]}
|
|
331
335
|
|
|
332
336
|
// 縮約操作
|
|
333
|
-
const
|
|
334
|
-
const oldest = collectable.reduce((a, b) => a.age > b.age ? a : b); // Optional.of({name: "Bob", age: 30, ...})
|
|
335
|
-
```
|
|
337
|
+
const sum = data.reduce(0, (acc, n) => acc + n); // 30
|
|
336
338
|
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
- **特性**: 最速のコレクター、ソートなし
|
|
341
|
-
- **使用シナリオ**: 順序が重要でない、最大のパフォーマンスが望まれる場合
|
|
342
|
-
- **メソッド**: すべてのCollectableメソッドを継承
|
|
343
|
-
|
|
344
|
-
#### OrderedCollectable<E>
|
|
345
|
-
- **特性**: 要素の順序を保証、パフォーマンスは低い
|
|
346
|
-
- **使用シナリオ**: ソートされた結果が必要な場合
|
|
347
|
-
- **特殊メソッド**: すべてのメソッドを継承、内部ソート状態を維持
|
|
339
|
+
// 出力操作
|
|
340
|
+
data.join(", "); // "2, 4, 6, 8, 10"
|
|
341
|
+
```
|
|
348
342
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
343
|
+
## 統計分析メソッド
|
|
344
|
+
|
|
345
|
+
### NumericStatisticsメソッド
|
|
346
|
+
|
|
347
|
+
| メソッド | 説明 | 時間計算量 | 空間計算量 |
|
|
348
|
+
|---------|------|------------|------------|
|
|
349
|
+
| `range()` | 範囲 | O(n) | O(1) |
|
|
350
|
+
| `variance()` | 分散 | O(n) | O(1) |
|
|
351
|
+
| `standardDeviation()` | 標準偏差 | O(n) | O(1) |
|
|
352
|
+
| `mean()` | 平均値 | O(n) | O(1) |
|
|
353
|
+
| `median()` | 中央値 | O(n log n) | O(n) |
|
|
354
|
+
| `mode()` | 最頻値 | O(n) | O(n) |
|
|
355
|
+
| `frequency()` | 度数分布 | O(n) | O(n) |
|
|
356
|
+
| `summate()` | 合計 | O(n) | O(1) |
|
|
357
|
+
| `quantile(quantile)` | 分位数 | O(n log n) | O(n) |
|
|
358
|
+
| `interquartileRange()` | 四分位範囲 | O(n log n) | O(n) |
|
|
359
|
+
| `skewness()` | 歪度 | O(n) | O(1) |
|
|
360
|
+
| `kurtosis()` | 尖度 | O(n) | O(1) |
|
|
355
361
|
|
|
356
|
-
**コード例補足:**
|
|
357
362
|
```typescript
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
//
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
const
|
|
363
|
+
// 統計分析例
|
|
364
|
+
const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
365
|
+
.toNumericStatistics();
|
|
366
|
+
|
|
367
|
+
console.log("平均値:", numbers.mean()); // 5.5
|
|
368
|
+
console.log("中央値:", numbers.median()); // 5.5
|
|
369
|
+
console.log("標準偏差:", numbers.standardDeviation()); // ~2.87
|
|
370
|
+
console.log("合計:", numbers.summate()); // 55
|
|
371
|
+
|
|
372
|
+
// マッパーを使用した統計分析
|
|
373
|
+
const objects = from([
|
|
374
|
+
{ value: 10 },
|
|
375
|
+
{ value: 20 },
|
|
376
|
+
{ value: 30 }
|
|
377
|
+
]).toNumericStatistics();
|
|
378
|
+
|
|
379
|
+
console.log("マップされた平均値:", objects.mean(obj => obj.value)); // 20
|
|
380
|
+
```
|
|
369
381
|
|
|
370
|
-
|
|
371
|
-
const windowed = data.toWindow();
|
|
372
|
-
const slidingWindows = windowed.slide(3n, 2n); // ウィンドウサイズ3、ステップ2
|
|
373
|
-
// ウィンドウ1: [1, 2, 3], ウィンドウ2: [3, 4, 5], ウィンドウ3: [5, 6, 7], ...
|
|
382
|
+
## パフォーマンス選択ガイド
|
|
374
383
|
|
|
375
|
-
|
|
376
|
-
|
|
384
|
+
### 非順序コレクターを選択(パフォーマンス優先)
|
|
385
|
+
```typescript
|
|
386
|
+
// 順序保証が不要な場合
|
|
387
|
+
const highPerformance = data
|
|
388
|
+
.filter(predicate)
|
|
389
|
+
.map(mapper)
|
|
390
|
+
.toUnoredered(); // 最高のパフォーマンス
|
|
377
391
|
```
|
|
378
392
|
|
|
379
|
-
###
|
|
380
|
-
|
|
381
|
-
統計分析の基底クラスで、豊富な統計計算メソッドを提供します。**注: 最初にSemanticインスタンスを通じてtoNumericStatistics()またはtoBigIntStatistics()を呼び出してStatisticsインスタンスを取得してから、以下のメソッドを使用する必要があります。**
|
|
382
|
-
|
|
383
|
-
#### 統計計算操作
|
|
384
|
-
|
|
385
|
-
| メソッド | 戻り値の型 | 説明 | アルゴリズム計算量 |
|
|
386
|
-
|------|----------|------|------------|
|
|
387
|
-
| `maximum()` | `Optional<E>` | 最大値 | O(n) |
|
|
388
|
-
| `minimum()` | `Optional<E>` | 最小値 | O(n) |
|
|
389
|
-
| `range()` | `D` | 範囲(最大-最小) | O(n) |
|
|
390
|
-
| `variance()` | `D` | 分散 | O(n) |
|
|
391
|
-
| `standardDeviation()` | `D` | 標準偏差 | O(n) |
|
|
392
|
-
| `mean()` | `D` | 平均値 | O(n) |
|
|
393
|
-
| `median()` | `D` | 中央値 | O(n log n) |
|
|
394
|
-
| `mode()` | `D` | 最頻値 | O(n) |
|
|
395
|
-
| `frequency()` | `Map<D, bigint>` | 度数分布 | O(n) |
|
|
396
|
-
| `summate()` | `D` | 合計 | O(n) |
|
|
397
|
-
| `quantile(quantile)` | `D` | 分位数 | O(n log n) |
|
|
398
|
-
| `interquartileRange()` | `D` | 四分位範囲 | O(n log n) |
|
|
399
|
-
| `skewness()` | `D` | 歪度 | O(n) |
|
|
400
|
-
| `kurtosis()` | `D` | 尖度 | O(n) |
|
|
401
|
-
|
|
402
|
-
**コード例補足:**
|
|
393
|
+
### 順序付きコレクターを選択(順序が必要)
|
|
403
394
|
```typescript
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
|
407
|
-
|
|
408
|
-
// 統計メソッドを使用する前に統計オブジェクトに変換する必要がある
|
|
409
|
-
const stats = numbers.toNumericStatistics();
|
|
410
|
-
|
|
411
|
-
// 基本統計
|
|
412
|
-
const count = stats.count(); // 10n
|
|
413
|
-
const max = stats.maximum(); // Optional.of(10)
|
|
414
|
-
const min = stats.minimum(); // Optional.of(1)
|
|
415
|
-
const range = stats.range(); // 9
|
|
416
|
-
const mean = stats.mean(); // 5.5
|
|
417
|
-
const median = stats.median(); // 5.5
|
|
418
|
-
const sum = stats.summate(); // 55
|
|
419
|
-
|
|
420
|
-
// 高度な統計
|
|
421
|
-
const variance = stats.variance(); // 8.25
|
|
422
|
-
const stdDev = stats.standardDeviation(); // 2.872
|
|
423
|
-
const mode = stats.mode(); // 任意の値(すべて1回ずつ出現するため)
|
|
424
|
-
const q1 = stats.quantile(0.25); // 3.25
|
|
425
|
-
const q3 = stats.quantile(0.75); // 7.75
|
|
426
|
-
const iqr = stats.interquartileRange(); // 4.5
|
|
427
|
-
|
|
428
|
-
// 度数分布
|
|
429
|
-
const freq = stats.frequency(); // Map {1 => 1n, 2 => 1n, ...}
|
|
395
|
+
// 要素の順序を維持する必要がある場合
|
|
396
|
+
const ordered = data.sorted(comparator);
|
|
430
397
|
```
|
|
431
398
|
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
**NumericStatistics<E>**
|
|
435
|
-
- number型の統計分析を処理
|
|
436
|
-
- すべての統計計算はnumber型を返す
|
|
437
|
-
|
|
438
|
-
**BigIntStatistics<E>**
|
|
439
|
-
- bigint型の統計分析を処理
|
|
440
|
-
- すべての統計計算はbigint型を返す
|
|
441
|
-
|
|
442
|
-
**コード例補足:**
|
|
399
|
+
### ウィンドウコレクターを選択(ウィンドウ操作)
|
|
443
400
|
```typescript
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
console.log(numericStats.mean()); // 30
|
|
451
|
-
console.log(numericStats.summate()); // 150
|
|
452
|
-
|
|
453
|
-
// ビッグ整数統計
|
|
454
|
-
const bigintData = from([100n, 200n, 300n, 400n, 500n]);
|
|
455
|
-
const bigintStats = bigintData.toBigIntStatistics();
|
|
456
|
-
|
|
457
|
-
console.log(bigintStats.mean()); // 300n
|
|
458
|
-
console.log(bigintStats.summate()); // 1500n
|
|
401
|
+
// ウィンドウ操作が必要な場合
|
|
402
|
+
const windowed = data
|
|
403
|
+
.toWindow()
|
|
404
|
+
.slide(5n, 2n); // スライディングウィンドウ
|
|
405
|
+
```
|
|
459
406
|
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
{ value: 45 }
|
|
466
|
-
]);
|
|
407
|
+
### 統計分析を選択(数値計算)
|
|
408
|
+
```typescript
|
|
409
|
+
// 統計分析が必要な場合
|
|
410
|
+
const stats = data
|
|
411
|
+
.toNumericStatistics(); // 数値統計
|
|
467
412
|
|
|
468
|
-
const
|
|
469
|
-
|
|
470
|
-
const sumWithMapper = objectStats.summate(obj => obj.value); // 120
|
|
413
|
+
const bigIntStats = data
|
|
414
|
+
.toBigintStatistics(); // BigInt統計
|
|
471
415
|
```
|
|
472
416
|
|
|
473
|
-
|
|
417
|
+
[GitHub](https://github.com/eloyhere/semantic-typescript)
|
|
418
|
+
[NPMJS](https://www.npmjs.com/package/semantic-typescript)
|
|
474
419
|
|
|
475
|
-
|
|
476
|
-
import { from, validate, invalidate } from 'semantic-typescript';
|
|
477
|
-
|
|
478
|
-
// 1. データストリーム作成
|
|
479
|
-
const rawData = [5, 2, 8, 1, null, 9, 3, undefined, 7, 4, 6];
|
|
480
|
-
const semanticStream = from(rawData);
|
|
481
|
-
|
|
482
|
-
// 2. ストリーム処理パイプライン
|
|
483
|
-
const processedStream = semanticStream
|
|
484
|
-
.filter(val => validate(val)) // nullとundefinedをフィルタリング
|
|
485
|
-
.map(val => val! * 2) // 各値を2倍(!を使用、validateが空でないことを保証するため)
|
|
486
|
-
.distinct(); // 重複を削除
|
|
487
|
-
|
|
488
|
-
// 3. Collectableに変換して終端操作を使用
|
|
489
|
-
const collectable = processedStream.toUnordered();
|
|
490
|
-
|
|
491
|
-
// 4. データ検証と使用
|
|
492
|
-
if (!collectable.isEmpty()) {
|
|
493
|
-
const results = collectable
|
|
494
|
-
.filter(x => x > 5) // 再度フィルタリング
|
|
495
|
-
.toArray(); // 配列に変換
|
|
496
|
-
|
|
497
|
-
console.log("処理結果:", results); // [16, 18, 14, 8, 12]
|
|
498
|
-
|
|
499
|
-
// 統計情報
|
|
500
|
-
const stats = processedStream.toNumericStatistics();
|
|
501
|
-
console.log("平均値:", stats.mean()); // 11.2
|
|
502
|
-
console.log("合計:", stats.summate()); // 56
|
|
503
|
-
}
|
|
420
|
+
## 重要な注意点
|
|
504
421
|
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
console.log("有効なデータ:", validData); // [1, 3, 4]
|
|
511
|
-
console.log("無効なデータ:", invalidData); // [null, null]
|
|
512
|
-
```
|
|
422
|
+
1. **ソート操作の影響**: 順序付きコレクターでは、`sorted()`操作が`redirect`, `translate`, `shuffle`, `reverse`の効果を上書きします
|
|
423
|
+
2. **パフォーマンス考慮**: 順序保証が不要な場合は、`toUnoredered()`を優先してより良いパフォーマンスを得てください
|
|
424
|
+
3. **メモリ使用量**: ソート操作にはO(n)の追加スペースが必要です
|
|
425
|
+
4. **リアルタイムデータ**: Semanticストリームはリアルタイムデータに適しており、非同期データソースをサポートします
|
|
513
426
|
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
1. **ストリーム作成**: `from()`、`range()`、`fill()`などのファクトリメソッドを使用してSemanticインスタンスを作成
|
|
517
|
-
2. **ストリーム変換**: Semanticインスタンスで`map()`、`filter()`、`distinct()`などのメソッドを呼び出し
|
|
518
|
-
3. **Collectableへの変換**: Semanticインスタンスを通じて以下のいずれかのメソッドを呼び出す必要があります:
|
|
519
|
-
- `toOrdered()` - 順序付きコレクター
|
|
520
|
-
- `toUnordered()` - 順序なしコレクター(最速)
|
|
521
|
-
- `toWindow()` - ウィンドウコレクター
|
|
522
|
-
- `toNumericStatistics()` - 数値統計
|
|
523
|
-
- `toBigIntStatistics()` - ビッグ整数統計
|
|
524
|
-
- `sorted()` - 自然順ソート
|
|
525
|
-
- `sorted(comparator)` - カスタムソート
|
|
526
|
-
4. **終端操作**: Collectableインスタンスで`toArray()`、`count()`、`summate()`などの終端メソッドを呼び出し
|
|
527
|
-
5. **データ検証**: `validate()`を使用してデータがnull/undefinedでないことを保証、`invalidate()`を使用して無効なデータをチェック
|
|
528
|
-
|
|
529
|
-
この設計は、型安全性とパフォーマンス最適化を確保しながら、豊富なストリーム処理機能を提供します。
|
|
427
|
+
このライブラリは、TypeScript開発者に強力で柔軟なストリーム処理能力を提供し、関数型プログラミングの利点と型安全性を組み合わせています。
|