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.ru.md
CHANGED
|
@@ -1,529 +1,428 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Библиотека потоковой обработки Semantic-TypeScript
|
|
2
2
|
|
|
3
3
|
## Введение
|
|
4
4
|
|
|
5
|
-
Semantic-TypeScript — это современная библиотека для
|
|
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
|
-
|
|
54
|
+
## Защитники типов (Type Guards)
|
|
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` | Проверяет boolean | O(1) | O(1) |
|
|
61
|
+
| `isString(t: unknown): t is string` | Проверяет string | O(1) | O(1) |
|
|
62
|
+
| `isNumber(t: unknown): t is number` | Проверяет number | O(1) | O(1) |
|
|
63
|
+
| `isFunction(t: unknown): t is Function` | Проверяет function | O(1) | O(1) |
|
|
64
|
+
| `isObject(t: unknown): t is object` | Проверяет object | O(1) | O(1) |
|
|
65
|
+
| `isSymbol(t: unknown): t is symbol` | Проверяет 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) |
|
|
67
79
|
|
|
68
|
-
| Метод | Сигнатура | Описание | Пример |
|
|
69
|
-
|------|------|------|------|
|
|
70
|
-
| `validate` | `<T>(t: MaybeInvalid<T>) => t is T` | Проверить, является ли значение валидным | `validate(null)` → `false` |
|
|
71
|
-
| `invalidate` | `<T>(t: MaybeInvalid<T>) => t is null\|undefined` | Проверить, является ли значение невалидным | `invalidate(0)` → `false` |
|
|
72
|
-
| `useCompare` | `<T>(t1: T, t2: T) => number` | Универсальная функция сравнения | `useCompare("a", "b")` → `-1` |
|
|
73
|
-
| `useRandom` | `<T = number\|bigint>(index: T) => T` | Генератор псевдослучайных чисел | `useRandom(5)` → случайное число |
|
|
74
|
-
|
|
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 гарантирует, что data не 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> - Безопасная обработка нулевых значений
|
|
93
|
+
## Утилитные функции
|
|
100
94
|
|
|
101
|
-
|
|
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) |
|
|
102
99
|
|
|
103
|
-
| Метод | Тип возврата | Описание | Сложность по времени |
|
|
104
|
-
|------|----------|------|------------|
|
|
105
|
-
| `filter(predicate: Predicate<T>)` | `Optional<T>` | Отфильтровать значения, удовлетворяющие условию | O(1) |
|
|
106
|
-
| `get()` | `T` | Получить значение, выбросить ошибку если пустое | O(1) |
|
|
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>` | Создать nullable Optional | O(1) |
|
|
114
|
-
| `static ofNonNull<T>(value: T)` | `Optional<T>` | Создать не-null Optional | O(1) |
|
|
115
|
-
|
|
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); // Случайное число на основе seed
|
|
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)` | Создает Optional, допускающий null | O(1) | O(1) |
|
|
118
|
+
| `Optional.ofNonNull<T>(value)` | Создает не-null Optional | 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>` | Объединить два потока | 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
|
+
// из-за ограничений системного планирования.
|
|
184
|
+
const intervalStream = interval(5000, 2000);
|
|
215
185
|
|
|
216
|
-
//
|
|
217
|
-
const
|
|
186
|
+
// Создать поток из итерируемого объекта
|
|
187
|
+
const numberStream = from([1, 2, 3, 4, 5]);
|
|
188
|
+
const stringStream = from(new Set(["Alex", "Bob"]));
|
|
218
189
|
|
|
219
|
-
//
|
|
220
|
-
const
|
|
190
|
+
// Создать поток диапазона
|
|
191
|
+
const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
221
192
|
|
|
222
|
-
//
|
|
193
|
+
// Поток событий WebSocket
|
|
194
|
+
const ws = new WebSocket("ws://localhost:8080");
|
|
195
|
+
websocket(ws)
|
|
196
|
+
.filter((event)=> event.type === "message") // Отслеживать только события сообщений
|
|
197
|
+
.toUnordered() // Для событий обычно без сортировки
|
|
198
|
+
.forEach((event)=> receive(event)); // Получать сообщения
|
|
223
199
|
```
|
|
224
200
|
|
|
225
|
-
|
|
201
|
+
## Методы класса Semantic
|
|
202
|
+
|
|
203
|
+
| Метод | Описание | Временная сложность | Пространственная сложность |
|
|
204
|
+
|-------|----------|-------------------|--------------------------|
|
|
205
|
+
| `concat(other)` | Объединяет два потока | O(n) | O(1) |
|
|
206
|
+
| `distinct()` | Удаляет дубликаты | O(n) | O(n) |
|
|
207
|
+
| `distinct(comparator)` | Удаляет дубликаты с компаратором | O(n²) | O(n) |
|
|
208
|
+
| `dropWhile(predicate)` | Отбрасывает элементы, удовлетворяющие предикату | O(n) | O(1) |
|
|
209
|
+
| `filter(predicate)` | Фильтрует элементы | O(n) | O(1) |
|
|
210
|
+
| `flat(mapper)` | Плоское отображение | O(n × m) | O(1) |
|
|
211
|
+
| `flatMap(mapper)` | Плоское отображение в новый тип | O(n × m) | O(1) |
|
|
212
|
+
| `limit(n)` | Ограничивает количество элементов | O(n) | O(1) |
|
|
213
|
+
| `map(mapper)` | Преобразование отображения | O(n) | O(1) |
|
|
214
|
+
| `peek(consumer)` | Просматривает элементы | O(n) | O(1) |
|
|
215
|
+
| `redirect(redirector)` | Перенаправление индексов | O(n) | O(1) |
|
|
216
|
+
| `reverse()` | Обращает поток | O(n) | O(1) |
|
|
217
|
+
| `shuffle()` | Случайное перемешивание | O(n) | O(1) |
|
|
218
|
+
| `shuffle(mapper)` | Перемешивание с маппером | O(n) | O(1) |
|
|
219
|
+
| `skip(n)` | Пропускает первые n элементов | O(n) | O(1) |
|
|
220
|
+
| `sorted()` | Сортирует | O(n log n) | O(n) |
|
|
221
|
+
| `sorted(comparator)` | Сортирует с компаратором | O(n log n) | O(n) |
|
|
222
|
+
| `sub(start, end)` | Получает подпоток | O(n) | O(1) |
|
|
223
|
+
| `takeWhile(predicate)` | Берет элементы, удовлетворяющие предикату | O(n) | O(1) |
|
|
224
|
+
| `translate(offset)` | Сдвиг индексов | O(n) | O(1) |
|
|
225
|
+
| `translate(translator)` | Сдвиг с транслятором | O(n) | O(1) |
|
|
226
226
|
|
|
227
|
-
Коллекторы используются для агрегации потоковых данных в определенные структуры.
|
|
228
|
-
|
|
229
|
-
| Метод | Описание | Сценарий использования |
|
|
230
|
-
|------|------|----------|
|
|
231
|
-
| `collect(generator)` | Выполнить сбор данных | Терминальная операция потока |
|
|
232
|
-
| `static full(identity, accumulator, finisher)` | Создать полный коллектор | Требует полной обработки |
|
|
233
|
-
| `static shortable(identity, interruptor, accumulator, finisher)` | Создать прерываемый коллектор | Может завершиться досрочно |
|
|
234
|
-
|
|
235
|
-
**Дополнение с примером кода:**
|
|
236
227
|
```typescript
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
//
|
|
240
|
-
|
|
241
|
-
()
|
|
242
|
-
(
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
//
|
|
247
|
-
const
|
|
248
|
-
|
|
228
|
+
// Примеры операций Semantic
|
|
229
|
+
const result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
230
|
+
.filter(n => n % 2 === 0) // Фильтрует четные числа
|
|
231
|
+
.map(n => n * 2) // Умножает на 2
|
|
232
|
+
.skip(1) // Пропускает первый
|
|
233
|
+
.limit(3) // Ограничивает 3 элементами
|
|
234
|
+
.toArray(); // Преобразует в массив
|
|
235
|
+
// Результат: [8, 12, 20]
|
|
236
|
+
|
|
237
|
+
// Пример сложной операции
|
|
238
|
+
const complexResult = range(1, 100, 1)
|
|
239
|
+
.flatMap(n => from([n, n * 2])) // Отображает каждый элемент в два элемента
|
|
240
|
+
.distinct() // Удаляет дубликаты
|
|
241
|
+
.shuffle() // Случайно перемешивает
|
|
242
|
+
.takeWhile(n => n < 50) // Берет элементы < 50
|
|
243
|
+
.toOrdered() // Преобразует в упорядоченный сборщик
|
|
244
|
+
.toArray(); // Преобразует в массив
|
|
249
245
|
```
|
|
250
246
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
Предоставляет богатые методы агрегации и преобразования данных. **Примечание: Сначала необходимо получить экземпляр Collectable, вызвав sorted(), toOrdered() и т.д. через экземпляр Semantic, перед использованием следующих методов.**
|
|
254
|
-
|
|
255
|
-
#### Операции запроса данных
|
|
247
|
+
## Методы преобразования сборщиков
|
|
256
248
|
|
|
257
|
-
| Метод |
|
|
258
|
-
|
|
259
|
-
| `
|
|
260
|
-
| `
|
|
261
|
-
| `
|
|
262
|
-
| `
|
|
263
|
-
| `
|
|
264
|
-
| `
|
|
265
|
-
| `findLast()` | `Optional<E>` | Найти последний элемент | `findLast()` |
|
|
249
|
+
| Метод | Описание | Временная сложность | Пространственная сложность |
|
|
250
|
+
|-------|----------|-------------------|--------------------------|
|
|
251
|
+
| `toUnoredered()` | Преобразует в неупорядоченный сборщик (приоритет производительности) | O(1) | O(1) |
|
|
252
|
+
| `toOrdered()` | Преобразует в упорядоченный сборщик | O(1) | O(1) |
|
|
253
|
+
| `sorted()` | Сортирует и преобразует в упорядоченный сборщик | O(n log n) | O(n) |
|
|
254
|
+
| `toWindow()` | Преобразует в оконный сборщик | O(1) | O(1) |
|
|
255
|
+
| `toNumericStatistics()` | Преобразует в числовую статистику | O(1) | O(1) |
|
|
256
|
+
| `toBigintStatistics()` | Преобразует в BigInt статистику | O(1) | O(1) |
|
|
266
257
|
|
|
267
|
-
**Дополнение с примером кода:**
|
|
268
258
|
```typescript
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
const
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
259
|
+
// Примеры преобразования сборщиков
|
|
260
|
+
const numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
|
|
261
|
+
|
|
262
|
+
// Приоритет производительности: Использовать неупорядоченный сборщик
|
|
263
|
+
const unordered = numbers
|
|
264
|
+
.filter(n => n > 3)
|
|
265
|
+
.toUnoredered();
|
|
266
|
+
|
|
267
|
+
// Нужна сортировка: Использовать упорядоченный сборщик
|
|
268
|
+
const ordered = numbers
|
|
269
|
+
.sorted()
|
|
270
|
+
.toOrdered();
|
|
271
|
+
|
|
272
|
+
// Статистический анализ: Использовать статистический сборщик
|
|
273
|
+
const stats = numbers
|
|
274
|
+
.toNumericStatistics();
|
|
275
|
+
|
|
276
|
+
console.log(stats.mean()); // Среднее значение
|
|
277
|
+
console.log(stats.median()); // Медиана
|
|
278
|
+
console.log(stats.standardDeviation()); // Стандартное отклонение
|
|
279
|
+
|
|
280
|
+
// Оконные операции
|
|
281
|
+
const windowed = numbers
|
|
282
|
+
.toWindow()
|
|
283
|
+
.tumble(3n); // Окно из 3 элементов
|
|
284
|
+
|
|
285
|
+
windowed.forEach(window => {
|
|
286
|
+
console.log(window.toArray()); // Содержимое каждого окна
|
|
287
|
+
});
|
|
283
288
|
```
|
|
284
289
|
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
| Метод |
|
|
288
|
-
|
|
289
|
-
| `
|
|
290
|
-
| `
|
|
291
|
-
| `
|
|
292
|
-
| `
|
|
293
|
-
| `
|
|
294
|
-
| `
|
|
295
|
-
| `
|
|
296
|
-
| `
|
|
297
|
-
| `
|
|
298
|
-
| `
|
|
299
|
-
| `
|
|
300
|
-
|
|
301
|
-
|
|
290
|
+
## Методы сбора Collectable
|
|
291
|
+
|
|
292
|
+
| Метод | Описание | Временная сложность | Пространственная сложность |
|
|
293
|
+
|-------|----------|-------------------|--------------------------|
|
|
294
|
+
| `anyMatch(predicate)` | Проверяет наличие совпадающих элементов | O(n) | O(1) |
|
|
295
|
+
| `allMatch(predicate)` | Проверяет совпадение всех элементов | O(n) | O(1) |
|
|
296
|
+
| `count()` | Подсчитывает элементы | O(n) | O(1) |
|
|
297
|
+
| `isEmpty()` | Проверяет пустоту | O(1) | O(1) |
|
|
298
|
+
| `findAny()` | Находит любой элемент | O(n) | O(1) |
|
|
299
|
+
| `findFirst()` | Находит первый элемент | O(n) | O(1) |
|
|
300
|
+
| `findLast()` | Находит последний элемент | O(n) | O(1) |
|
|
301
|
+
| `forEach(action)` | Перебирает все элементы | O(n) | O(1) |
|
|
302
|
+
| `group(classifier)` | Группирует по классификатору | O(n) | O(n) |
|
|
303
|
+
| `groupBy(keyExtractor, valueExtractor)` | Группирует по экстракторам ключ-значение | O(n) | O(n) |
|
|
304
|
+
| `join()` | Объединяет в строку | O(n) | O(n) |
|
|
305
|
+
| `join(delimiter)` | Объединяет с разделителем | O(n) | O(n) |
|
|
306
|
+
| `nonMatch(predicate)` | Проверяет отсутствие совпадений | O(n) | O(1) |
|
|
307
|
+
| `partition(count)` | Разделяет по количеству | O(n) | O(n) |
|
|
308
|
+
| `partitionBy(classifier)` | Разделяет по классификатору | O(n) | O(n) |
|
|
309
|
+
| `reduce(accumulator)` | Операция свертки | O(n) | O(1) |
|
|
310
|
+
| `reduce(identity, accumulator)` | Свертка с начальным значением | O(n) | O(1) |
|
|
311
|
+
| `toArray()` | Преобразует в массив | O(n) | O(n) |
|
|
312
|
+
| `toMap(keyExtractor, valueExtractor)` | Преобразует в Map | O(n) | O(n) |
|
|
313
|
+
| `toSet()` | Преобразует в Set | O(n) | O(n) |
|
|
314
|
+
| `write(stream)` | Записывает в поток | O(n) | O(1) |
|
|
315
|
+
|
|
302
316
|
```typescript
|
|
303
|
-
|
|
317
|
+
// Примеры операций Collectable
|
|
318
|
+
const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
319
|
+
.filter(n => n % 2 === 0)
|
|
320
|
+
.toOrdered();
|
|
304
321
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
{ name: "Charlie", age: 25, city: "New York" }
|
|
309
|
-
]);
|
|
322
|
+
// Проверки совпадения
|
|
323
|
+
console.log(data.anyMatch(n => n > 5)); // true
|
|
324
|
+
console.log(data.allMatch(n => n < 20)); // true
|
|
310
325
|
|
|
311
|
-
//
|
|
312
|
-
|
|
326
|
+
// Операции поиска
|
|
327
|
+
data.findFirst().ifPresent(n => console.log(n)); // 2
|
|
328
|
+
data.findAny().ifPresent(n => console.log(n)); // Любой элемент
|
|
313
329
|
|
|
314
330
|
// Операции группировки
|
|
315
|
-
const
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
const byAge = collectable.groupBy(
|
|
319
|
-
person => person.age,
|
|
320
|
-
person => person.name
|
|
331
|
+
const grouped = data.groupBy(
|
|
332
|
+
n => n > 5 ? "large" : "small",
|
|
333
|
+
n => n * 2
|
|
321
334
|
);
|
|
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 }
|
|
331
|
-
|
|
332
|
-
// Операции редукции
|
|
333
|
-
const totalAge = collectable.reduce(0, (acc, person) => acc + person.age); // 80
|
|
334
|
-
const oldest = collectable.reduce((a, b) => a.age > b.age ? a : b); // Optional.of({name: "Bob", age: 30, ...})
|
|
335
|
-
```
|
|
335
|
+
// {small: [4, 8], large: [12, 16, 20]}
|
|
336
336
|
|
|
337
|
-
|
|
337
|
+
// Операции свертки
|
|
338
|
+
const sum = data.reduce(0, (acc, n) => acc + n); // 30
|
|
338
339
|
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
- **Методы**: Наследует все методы Collectable
|
|
343
|
-
|
|
344
|
-
#### OrderedCollectable<E>
|
|
345
|
-
- **Характеристики**: Гарантирует порядок элементов, низкая производительность
|
|
346
|
-
- **Сценарии использования**: Требуются отсортированные результаты
|
|
347
|
-
- **Специальные методы**: Наследует все методы, сохраняет внутреннее состояние сортировки
|
|
340
|
+
// Операции вывода
|
|
341
|
+
data.join(", "); // "2, 4, 6, 8, 10"
|
|
342
|
+
```
|
|
348
343
|
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
344
|
+
## Методы статистического анализа
|
|
345
|
+
|
|
346
|
+
### Методы NumericStatistics
|
|
347
|
+
|
|
348
|
+
| Метод | Описание | Временная сложность | Пространственная сложность |
|
|
349
|
+
|-------|----------|-------------------|--------------------------|
|
|
350
|
+
| `range()` | Размах | O(n) | O(1) |
|
|
351
|
+
| `variance()` | Дисперсия | O(n) | O(1) |
|
|
352
|
+
| `standardDeviation()` | Стандартное отклонение | O(n) | O(1) |
|
|
353
|
+
| `mean()` | Среднее значение | O(n) | O(1) |
|
|
354
|
+
| `median()` | Медиана | O(n log n) | O(n) |
|
|
355
|
+
| `mode()` | Мода | O(n) | O(n) |
|
|
356
|
+
| `frequency()` | Распределение частот | O(n) | O(n) |
|
|
357
|
+
| `summate()` | Суммирование | O(n) | O(1) |
|
|
358
|
+
| `quantile(quantile)` | Квантиль | O(n log n) | O(n) |
|
|
359
|
+
| `interquartileRange()` | Интерквартильный размах | O(n log n) | O(n) |
|
|
360
|
+
| `skewness()` | Асимметрия | O(n) | O(1) |
|
|
361
|
+
| `kurtosis()` | Эксцесс | O(n) | O(1) |
|
|
355
362
|
|
|
356
|
-
**Дополнение с примером кода:**
|
|
357
363
|
```typescript
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
const
|
|
364
|
+
// Примеры статистического анализа
|
|
365
|
+
const numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
366
|
+
.toNumericStatistics();
|
|
367
|
+
|
|
368
|
+
console.log("Среднее значение:", numbers.mean()); // 5.5
|
|
369
|
+
console.log("Медиана:", numbers.median()); // 5.5
|
|
370
|
+
console.log("Стандартное отклонение:", numbers.standardDeviation()); // ~2.87
|
|
371
|
+
console.log("Сумма:", numbers.summate()); // 55
|
|
372
|
+
|
|
373
|
+
// Статистический анализ с маппером
|
|
374
|
+
const objects = from([
|
|
375
|
+
{ value: 10 },
|
|
376
|
+
{ value: 20 },
|
|
377
|
+
{ value: 30 }
|
|
378
|
+
]).toNumericStatistics();
|
|
379
|
+
|
|
380
|
+
console.log("Отображенное среднее:", objects.mean(obj => obj.value)); // 20
|
|
381
|
+
```
|
|
369
382
|
|
|
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], ...
|
|
383
|
+
## Руководство по выбору производительности
|
|
374
384
|
|
|
375
|
-
|
|
376
|
-
|
|
385
|
+
### Выбор неупорядоченного сборщика (Приоритет производительности)
|
|
386
|
+
```typescript
|
|
387
|
+
// Когда гарантия порядка не требуется
|
|
388
|
+
const highPerformance = data
|
|
389
|
+
.filter(predicate)
|
|
390
|
+
.map(mapper)
|
|
391
|
+
.toUnoredered(); // Лучшая производительность
|
|
377
392
|
```
|
|
378
393
|
|
|
379
|
-
###
|
|
380
|
-
|
|
381
|
-
Базовый класс статистического анализа, предоставляющий богатые методы статистических вычислений. **Примечание: Сначала необходимо получить экземпляр Statistics, вызвав toNumericStatistics() или toBigIntStatistics() через экземпляр Semantic, перед использованием следующих методов.**
|
|
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
|
-
**Дополнение с примером кода:**
|
|
394
|
+
### Выбор упорядоченного сборщика (Требуется порядок)
|
|
403
395
|
```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(); // Любое значение (так как все встречаются по одному разу)
|
|
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, ...}
|
|
396
|
+
// Когда порядок элементов должен сохраняться
|
|
397
|
+
const ordered = data.sorted(comparator);
|
|
430
398
|
```
|
|
431
399
|
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
**NumericStatistics<E>**
|
|
435
|
-
- Обрабатывает статистический анализ числового типа
|
|
436
|
-
- Все статистические вычисления возвращают числовой тип
|
|
437
|
-
|
|
438
|
-
**BigIntStatistics<E>**
|
|
439
|
-
- Обрабатывает статистический анализ типа bigint
|
|
440
|
-
- Все статистические вычисления возвращают тип bigint
|
|
441
|
-
|
|
442
|
-
**Дополнение с примером кода:**
|
|
400
|
+
### Выбор оконного сборщика (Оконные операции)
|
|
443
401
|
```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
|
|
402
|
+
// Когда требуются оконные операции
|
|
403
|
+
const windowed = data
|
|
404
|
+
.toWindow()
|
|
405
|
+
.slide(5n, 2n); // Скользящее окно
|
|
406
|
+
```
|
|
459
407
|
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
{ value: 45 }
|
|
466
|
-
]);
|
|
408
|
+
### Выбор статистического анализа (Численные вычисления)
|
|
409
|
+
```typescript
|
|
410
|
+
// Когда требуется статистический анализ
|
|
411
|
+
const stats = data
|
|
412
|
+
.toNumericStatistics(); // Численная статистика
|
|
467
413
|
|
|
468
|
-
const
|
|
469
|
-
|
|
470
|
-
const sumWithMapper = objectStats.summate(obj => obj.value); // 120
|
|
414
|
+
const bigIntStats = data
|
|
415
|
+
.toBigintStatistics(); // BigInt статистика
|
|
471
416
|
```
|
|
472
417
|
|
|
473
|
-
|
|
418
|
+
[GitHub](https://github.com/eloyhere/semantic-typescript)
|
|
419
|
+
[NPMJS](https://www.npmjs.com/package/semantic-typescript)
|
|
474
420
|
|
|
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
|
-
}
|
|
421
|
+
## Важные замечания
|
|
504
422
|
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
console.log("Валидные данные:", validData); // [1, 3, 4]
|
|
511
|
-
console.log("Невалидные данные:", invalidData); // [null, null]
|
|
512
|
-
```
|
|
423
|
+
1. **Влияние операций сортировки**: В упорядоченных сборщиках операция `sorted()` перезаписывает эффекты `redirect`, `translate`, `shuffle`
|
|
424
|
+
2. **Соображения производительности**: Если гарантия порядка не требуется, отдавайте приоритет `toUnoredered()` для лучшей производительности
|
|
425
|
+
3. **Использование памяти**: Операции сортировки требуют O(n) дополнительного пространства
|
|
426
|
+
4. **Данные реального времени**: Потоки Semantic идеально подходят для данных реального времени и поддерживают асинхронные источники данных
|
|
513
427
|
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
1. **Создать поток**: Используйте фабричные методы `from()`, `range()`, `fill()` и т.д. для создания экземпляров Semantic
|
|
517
|
-
2. **Преобразование потока**: Вызывайте методы `map()`, `filter()`, `distinct()` и т.д. на экземплярах Semantic
|
|
518
|
-
3. **Преобразовать в Collectable**: Необходимо вызвать один из следующих методов через экземпляр Semantic:
|
|
519
|
-
- `toOrdered()` - Упорядоченный коллектор
|
|
520
|
-
- `toUnordered()` - Неупорядоченный коллектор (самый быстрый)
|
|
521
|
-
- `toWindow()` - Оконный коллектор
|
|
522
|
-
- `toNumericStatistics()` - Числовая статистика
|
|
523
|
-
- `toBigIntStatistics()` - Статистика больших целых чисел
|
|
524
|
-
- `sorted()` - Естественная сортировка
|
|
525
|
-
- `sorted(comparator)` - Пользовательская сортировка
|
|
526
|
-
4. **Терминальные операции**: Вызывайте терминальные методы `toArray()`, `count()`, `summate()` и т.д. на экземплярах Collectable
|
|
527
|
-
5. **Проверка данных**: Используйте `validate()` для гарантии, что данные не null/undefined, используйте `invalidate()` для проверки невалидных данных
|
|
528
|
-
|
|
529
|
-
Этот дизайн обеспечивает типобезопасность и оптимизацию производительности, предоставляя при этом богатый функционал потоковой обработки.
|
|
428
|
+
Эта библиотека предоставляет TypeScript-разработчикам мощные и гибкие возможности обработки потоков, сочетая преимущества функционального программирования с типобезопасностью.
|