semantic-typescript 0.2.6 → 0.2.7
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/factory.d.ts +2 -1
- package/dist/factory.js +46 -26
- package/dist/guard.d.ts +3 -1
- package/dist/guard.js +12 -0
- package/dist/index.d.ts +5 -5
- package/dist/index.js +5 -5
- package/dist/semantic.d.ts +1 -1
- package/dist/semantic.js +1 -1
- package/dist/utility.d.ts +1 -0
- package/package.json +1 -1
- package/readme.cn.md +166 -151
- package/readme.de.md +292 -283
- package/readme.es.md +244 -241
- package/readme.fr.md +246 -235
- package/readme.jp.md +280 -268
- package/readme.kr.md +254 -248
- package/readme.md +85 -67
- package/readme.ru.md +239 -242
- package/readme.tw.md +245 -244
package/readme.kr.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
#
|
|
1
|
+
# 시맨틱 타입스크립트 스트림 처리 라이브러리
|
|
2
2
|
|
|
3
3
|
## 소개
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
시맨틱 타입스크립트는 자바스크립트의 제너레이터 함수, 자바 스트림, 그리고 MySQL 인덱스에서 영감을 받은 현대적인 스트림 처리 라이브러리입니다. 그 핵심 설계 철학은 데이터 인덱싱을 사용하여 효율적인 데이터 처리 파이프라인을 구축하는 것에 기반을 두고 있으며, 프론트엔드 개발을 위한 타입 안전하고 함수형 스타일의 스트리밍 작업 경험을 제공합니다.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
전통적인 동기 처리와 달리, 시맨틱은 비동기 처리 모델을 사용합니다. 데이터 스트림을 생성할 때, 터미널이 데이터를 수신하는 시간은 업스트림이 `accept`와 `interrupt` 콜백 함수를 호출하는 시점에 전적으로 의존합니다. 이러한 디자인은 라이브러리가 실시간 데이터 스트림, 대규모 데이터 세트 및 비동기 데이터 소스를 우아하게 처리할 수 있게 해줍니다.
|
|
8
8
|
|
|
9
9
|
## 설치
|
|
10
10
|
|
|
@@ -16,11 +16,11 @@ npm install semantic-typescript
|
|
|
16
16
|
|
|
17
17
|
| 타입 | 설명 |
|
|
18
18
|
|------|-------------|
|
|
19
|
-
| `Invalid<T>` | `null` 또는 `undefined
|
|
20
|
-
| `Valid<T>` | `null
|
|
21
|
-
| `MaybeInvalid<T>` | `null` 또는 `undefined
|
|
22
|
-
| `Primitive` |
|
|
23
|
-
| `MaybePrimitive<T>` |
|
|
19
|
+
| `Invalid<T>` | `null` 또는 `undefined`에서 확장된 타입 |
|
|
20
|
+
| `Valid<T>` | `null`과 `undefined`를 제외한 타입 |
|
|
21
|
+
| `MaybeInvalid<T>` | `null` 또는 `undefined`일 수 있는 타입 |
|
|
22
|
+
| `Primitive` | 기본 타입의 집합 |
|
|
23
|
+
| `MaybePrimitive<T>` | 기본 타입일 수 있는 타입 |
|
|
24
24
|
| `OptionalSymbol` | `Optional` 클래스의 심볼 식별자 |
|
|
25
25
|
| `SemanticSymbol` | `Semantic` 클래스의 심볼 식별자 |
|
|
26
26
|
| `CollectorsSymbol` | `Collector` 클래스의 심볼 식별자 |
|
|
@@ -32,67 +32,76 @@ npm install semantic-typescript
|
|
|
32
32
|
| `BigIntStatisticsSymbol` | `BigIntStatistics` 클래스의 심볼 식별자 |
|
|
33
33
|
| `UnorderedCollectableSymbol` | `UnorderedCollectable` 클래스의 심볼 식별자 |
|
|
34
34
|
|
|
35
|
-
##
|
|
35
|
+
## 함수 지향 인터페이스
|
|
36
36
|
|
|
37
37
|
| 인터페이스 | 설명 |
|
|
38
38
|
|-----------|-------------|
|
|
39
|
-
| `Runnable` |
|
|
40
|
-
| `Supplier<R>` |
|
|
39
|
+
| `Runnable` | 매개변수가 없고 반환값도 없는 함수 |
|
|
40
|
+
| `Supplier<R>` | 매개변수가 없고 `R`을 반환하는 함수 |
|
|
41
41
|
| `Functional<T, R>` | 단일 매개변수 변환 함수 |
|
|
42
|
-
| `BiFunctional<T, U, R>` | 두 매개변수 변환 함수 |
|
|
43
|
-
| `TriFunctional<T, U, V, R>` | 세 매개변수 변환 함수 |
|
|
42
|
+
| `BiFunctional<T, U, R>` | 두 개의 매개변수 변환 함수 |
|
|
43
|
+
| `TriFunctional<T, U, V, R>` | 세 개의 매개변수 변환 함수 |
|
|
44
44
|
| `Predicate<T>` | 단일 매개변수 조건 함수 |
|
|
45
|
-
| `BiPredicate<T, U>` | 두 매개변수 조건 함수 |
|
|
46
|
-
| `TriPredicate<T, U, V>` | 세 매개변수 조건 함수 |
|
|
47
|
-
| `Consumer<T>` | 단일 매개변수
|
|
48
|
-
| `BiConsumer<T, U>` | 두 매개변수
|
|
49
|
-
| `TriConsumer<T, U, V>` | 세 매개변수
|
|
50
|
-
| `Comparator<T>` | 두 매개변수 비교 함수 |
|
|
51
|
-
| `Generator<T>` |
|
|
45
|
+
| `BiPredicate<T, U>` | 두 개의 매개변수 조건 함수 |
|
|
46
|
+
| `TriPredicate<T, U, V>` | 세 개의 매개변수 조건 함수 |
|
|
47
|
+
| `Consumer<T>` | 단일 매개변수 소비자 함수 |
|
|
48
|
+
| `BiConsumer<T, U>` | 두 개의 매개변수 소비자 함수 |
|
|
49
|
+
| `TriConsumer<T, U, V>` | 세 개의 매개변수 소비자 함수 |
|
|
50
|
+
| `Comparator<T>` | 두 개의 매개변수 비교 함수 |
|
|
51
|
+
| `Generator<T>` | 생성자 함수(핵심 및 기반) |
|
|
52
52
|
|
|
53
53
|
```typescript
|
|
54
|
-
// 타입 사용
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
54
|
+
// 타입 사용 예
|
|
55
|
+
let predicate: Predicate<number> = (n: number): boolean => n > 0;
|
|
56
|
+
let mapper: Functional<string, number> = (text: string): number => text.length;
|
|
57
|
+
let comparator: Comparator<number> = (a: number, b: number): number => a - b;
|
|
58
58
|
```
|
|
59
59
|
|
|
60
60
|
## 타입 가드
|
|
61
61
|
|
|
62
62
|
| 함수 | 설명 | 시간 복잡도 | 공간 복잡도 |
|
|
63
63
|
|------|------|------------|------------|
|
|
64
|
-
| `validate<T>(t: MaybeInvalid<T>): t is T` | 값이 null
|
|
65
|
-
| `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | 값이 null
|
|
66
|
-
| `isBoolean(t: unknown): t is boolean` |
|
|
67
|
-
| `isString(t: unknown): t is string` |
|
|
68
|
-
| `isNumber(t: unknown): t is number` |
|
|
69
|
-
| `isFunction(t: unknown): t is Function` |
|
|
70
|
-
| `isObject(t: unknown): t is object` |
|
|
71
|
-
| `isSymbol(t: unknown): t is symbol` |
|
|
72
|
-
| `isBigint(t: unknown): t is bigint` | BigInt
|
|
73
|
-
| `isPrimitive(t: unknown): t is Primitive` | 기본
|
|
74
|
-
| `isIterable(t: unknown): t is Iterable<unknown>` | 반복
|
|
75
|
-
| `isOptional(t: unknown): t is Optional<unknown>` | Optional
|
|
76
|
-
| `isSemantic(t: unknown): t is Semantic<unknown>` | Semantic
|
|
77
|
-
| `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | Collector
|
|
78
|
-
| `isCollectable(t: unknown): t is Collectable<unknown>` | Collectable
|
|
79
|
-
| `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | OrderedCollectable
|
|
80
|
-
| `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | WindowCollectable
|
|
81
|
-
| `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | UnorderedCollectable
|
|
82
|
-
| `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | Statistics
|
|
83
|
-
| `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | NumericStatistics
|
|
84
|
-
| `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | BigIntStatistics
|
|
64
|
+
| `validate<T>(t: MaybeInvalid<T>): t is T` | 값이 null이나 undefined가 아닌지 검증 | O(1) | O(1) |
|
|
65
|
+
| `invalidate<T>(t: MaybeInvalid<T>): t is null \| undefined` | 값이 null이나 undefined인지 검증 | O(1) | O(1) |
|
|
66
|
+
| `isBoolean(t: unknown): t is boolean` | boolean인지 확인 | O(1) | O(1) |
|
|
67
|
+
| `isString(t: unknown): t is string` | 문자열인지 확인 | O(1) | O(1) |
|
|
68
|
+
| `isNumber(t: unknown): t is number` | 숫자인지 확인 | O(1) | O(1) |
|
|
69
|
+
| `isFunction(t: unknown): t is Function` | 함수인지 확인 | O(1) | O(1) |
|
|
70
|
+
| `isObject(t: unknown): t is object` | 객체인지 확인 | O(1) | O(1) |
|
|
71
|
+
| `isSymbol(t: unknown): t is symbol` | 심볼인지 확인 | O(1) | O(1) |
|
|
72
|
+
| `isBigint(t: unknown): t is bigint` | BigInt인지 확인 | O(1) | O(1) |
|
|
73
|
+
| `isPrimitive(t: unknown): t is Primitive` | 기본 타입인지 확인 | O(1) | O(1) |
|
|
74
|
+
| `isIterable(t: unknown): t is Iterable<unknown>` | 반복 가능한 객체인지 확인 | O(1) | O(1) |
|
|
75
|
+
| `isOptional(t: unknown): t is Optional<unknown>` | Optional 인스턴스인지 확인 | O(1) | O(1) |
|
|
76
|
+
| `isSemantic(t: unknown): t is Semantic<unknown>` | Semantic 인스턴스인지 확인 | O(1) | O(1) |
|
|
77
|
+
| `isCollector(t: unknown): t is Collector<unknown, unknown, unknown>` | Collector 인스턴스인지 확인 | O(1) | O(1) |
|
|
78
|
+
| `isCollectable(t: unknown): t is Collectable<unknown>` | Collectable 인스턴스인지 확인 | O(1) | O(1) |
|
|
79
|
+
| `isOrderedCollectable(t: unknown): t is OrderedCollectable<unknown>` | OrderedCollectable 인스턴스인지 확인 | O(1) | O(1) |
|
|
80
|
+
| `isWindowCollectable(t: unknown): t is WindowCollectable<unknown>` | WindowCollectable 인스턴스인지 확인 | O(1) | O(1) |
|
|
81
|
+
| `isUnorderedCollectable(t: unknown): t is UnorderedCollectable<unknown>` | UnorderedCollectable 인스턴스인지 확인 | O(1) | O(1) |
|
|
82
|
+
| `isStatistics(t: unknown): t is Statistics<unknown, number \| bigint>` | Statistics 인스턴스인지 확인 | O(1) | O(1) |
|
|
83
|
+
| `isNumericStatistics(t: unknown): t is NumericStatistics<unknown>` | NumericStatistics 인스턴스인지 확인 | O(1) | O(1) |
|
|
84
|
+
| `isBigIntStatistics(t: unknown): t is BigIntStatistics<unknown>` | BigIntStatistics 인스턴스인지 확인 | O(1) | O(1) |
|
|
85
|
+
| `isPromise(t: unknown): t is Promise<unknown>` | Promise 객체인지 확인 | O(1) | O(1) |
|
|
86
|
+
| `isAsync(t: unknown): t is AsyncFunction` | AsyncFunction인지 확인 | O(1) | O(1) |
|
|
85
87
|
|
|
86
88
|
```typescript
|
|
87
|
-
// 타입 가드 사용
|
|
88
|
-
|
|
89
|
+
// 타입 가드 사용 예
|
|
90
|
+
let value: unknown = "hello";
|
|
89
91
|
|
|
90
92
|
if (isString(value)) {
|
|
91
|
-
console.log(value.length); // 타입 안전, value는
|
|
93
|
+
console.log(value.length); // 타입 안전, value는 문자열로 추론됩니다.
|
|
92
94
|
}
|
|
93
95
|
|
|
94
96
|
if (isOptional(someValue)) {
|
|
95
|
-
someValue.ifPresent(
|
|
97
|
+
someValue.ifPresent((value): void => console.log(val));
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if(isIterable(value)){
|
|
101
|
+
// 타입 안전, 이제 반복 가능한 객체입니다.
|
|
102
|
+
for(let item of value){
|
|
103
|
+
console.log(item);
|
|
104
|
+
}
|
|
96
105
|
}
|
|
97
106
|
```
|
|
98
107
|
|
|
@@ -100,373 +109,370 @@ if (isOptional(someValue)) {
|
|
|
100
109
|
|
|
101
110
|
| 함수 | 설명 | 시간 복잡도 | 공간 복잡도 |
|
|
102
111
|
|------|------|------------|------------|
|
|
103
|
-
| `useCompare<T>(t1: T, t2: T): number` |
|
|
112
|
+
| `useCompare<T>(t1: T, t2: T): number` | 일반 비교 함수 | O(1) | O(1) |
|
|
104
113
|
| `useRandom<T = number \| bigint>(index: T): T` | 의사 난수 생성기 | O(log n) | O(1) |
|
|
105
114
|
|
|
106
115
|
```typescript
|
|
107
|
-
// 유틸리티 함수 사용
|
|
108
|
-
|
|
116
|
+
// 유틸리티 함수 사용 예
|
|
117
|
+
let numbers: Array<number> = [3, 1, 4, 1, 5];
|
|
109
118
|
numbers.sort(useCompare); // [1, 1, 3, 4, 5]
|
|
110
119
|
|
|
111
|
-
|
|
112
|
-
const randomBigInt = useRandom(1000n); // BigInt 난수
|
|
120
|
+
let randomNum = useRandom(42); // 시드 기반 난수
|
|
113
121
|
```
|
|
114
122
|
|
|
115
|
-
## 팩토리
|
|
123
|
+
## 팩토리 메소드
|
|
116
124
|
|
|
117
|
-
###
|
|
125
|
+
### 옵셔널 팩토리 메소드
|
|
118
126
|
|
|
119
|
-
|
|
|
120
|
-
|
|
121
|
-
| `Optional.empty<T>()` | 빈
|
|
122
|
-
| `Optional.of<T>(value)` | 값을
|
|
123
|
-
| `Optional.ofNullable<T>(value)` |
|
|
124
|
-
| `Optional.ofNonNull<T>(value)` |
|
|
127
|
+
| 메소드 | 설명 | 시간 복잡도 | 공간 복잡도 |
|
|
128
|
+
|------|------|------------|------------|
|
|
129
|
+
| `Optional.empty<T>()` | 빈 옵셔널을 생성 | O(1) | O(1) |
|
|
130
|
+
| `Optional.of<T>(value)` | 값을 포함하는 옵셔널을 생성 | O(1) | O(1) |
|
|
131
|
+
| `Optional.ofNullable<T>(value)` | 비어있을 수 있는 옵셔널을 생성 | O(1) | O(1) |
|
|
132
|
+
| `Optional.ofNonNull<T>(value)` | 비어있지 않은 옵셔널을 생성 | O(1) | O(1) |
|
|
125
133
|
|
|
126
134
|
```typescript
|
|
127
|
-
//
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
console.log(emptyOpt.
|
|
135
|
+
// 옵셔널 사용 예
|
|
136
|
+
let empty: Optional<number> = Optional.empty();
|
|
137
|
+
let present: Optional<number> = Optional.of(42);
|
|
138
|
+
let nullable: Optional<string> = Optional.ofNullable<string>(null);
|
|
139
|
+
let nonNull: Optional<string> = Optional.ofNonNull("hello");
|
|
140
|
+
|
|
141
|
+
present.ifPresent((val: number): void => console.log(val)); // 42 출력
|
|
142
|
+
console.log(emptyOpt.get(100)); // 100 출력
|
|
135
143
|
```
|
|
136
144
|
|
|
137
|
-
###
|
|
145
|
+
### 컬렉터 팩토리 메소드
|
|
138
146
|
|
|
139
|
-
|
|
|
140
|
-
|
|
141
|
-
| `Collector.full(identity, accumulator, finisher)` | 완전한
|
|
142
|
-
| `Collector.shortable(identity, interruptor, accumulator, finisher)` | 중단 가능한
|
|
147
|
+
| 메소드 | 설명 | 시간 복잡도 | 공간 복잡도 |
|
|
148
|
+
|------|------|------------|------------|
|
|
149
|
+
| `Collector.full(identity, accumulator, finisher)` | 완전한 컬렉터를 생성 | O(1) | O(1) |
|
|
150
|
+
| `Collector.shortable(identity, interruptor, accumulator, finisher)` | 중단 가능한 컬렉터를 생성 | O(1) | O(1) |
|
|
143
151
|
|
|
144
152
|
```typescript
|
|
145
|
-
// 컬렉터 변환
|
|
146
|
-
|
|
153
|
+
// 컬렉터 변환 예
|
|
154
|
+
let numbers = from([3, 1, 4, 1, 5, 9, 2, 6, 5]);
|
|
147
155
|
|
|
148
|
-
// 성능 우선:
|
|
149
|
-
|
|
150
|
-
.filter(n => n > 3)
|
|
151
|
-
.
|
|
156
|
+
// 성능 우선: 순서가 보장되지 않는 컬렉터 사용
|
|
157
|
+
let unordered = numbers
|
|
158
|
+
.filter((n: number): boolean => n > 3)
|
|
159
|
+
.toUnordered(); // 최고의 성능
|
|
152
160
|
|
|
153
|
-
// 정렬 필요:
|
|
154
|
-
|
|
161
|
+
// 정렬 필요: 순서가 보장되는 컬렉터 사용
|
|
162
|
+
let ordered = numbers.sorted();
|
|
155
163
|
|
|
156
|
-
// 요소
|
|
164
|
+
// 요소 수 계산
|
|
157
165
|
let count = Collector.full(
|
|
158
|
-
() => 0, // 초기값
|
|
159
|
-
(accumulator, element) => accumulator + element, // 누적
|
|
160
|
-
(accumulator) => accumulator // 완료
|
|
166
|
+
(): number => 0, // 초기값
|
|
167
|
+
(accumulator: number, element: number): number => accumulator + element, // 누적
|
|
168
|
+
(accumulator: number): number => accumulator // 완료
|
|
161
169
|
);
|
|
162
170
|
count.collect(from([1,2,3,4,5])); // 스트림에서 카운트
|
|
163
|
-
count.collect([1,2,3,4,5]); //
|
|
171
|
+
count.collect([1,2,3,4,5]); // 반복 가능한 객체에서 카운트
|
|
164
172
|
|
|
165
173
|
let find = Collector.shortable(
|
|
166
|
-
() => Optional.empty(), // 초기값
|
|
167
|
-
(element, index, accumulator) => accumulator.isPresent(), // 중단
|
|
168
|
-
(accumulator
|
|
169
|
-
(accumulator) => accumulator // 완료
|
|
174
|
+
(): Optional<number> => Optional.empty(), // 초기값
|
|
175
|
+
(element: number, index: bigint, accumulator: Optional<number>): Optional<number> => accumulator.isPresent(), // 중단
|
|
176
|
+
(accumulator: Optional<number>, element: number, index: bigint): Optional<number> => Optional.of(element), // 누적
|
|
177
|
+
(accumulator: Optional<number>): Optional<number> => accumulator // 완료
|
|
170
178
|
);
|
|
171
179
|
find.collect(from([1,2,3,4,5])); // 첫 번째 요소 찾기
|
|
172
180
|
find.collect([1,2,3,4,5]); // 첫 번째 요소 찾기
|
|
173
181
|
```
|
|
174
182
|
|
|
175
|
-
###
|
|
183
|
+
### 시맨틱 팩토리 메소드
|
|
176
184
|
|
|
177
|
-
|
|
|
178
|
-
|
|
179
|
-
| `
|
|
180
|
-
| `
|
|
181
|
-
| `
|
|
182
|
-
| `
|
|
183
|
-
| `
|
|
184
|
-
| `interval(period, delay?)` |
|
|
185
|
-
| `iterate<E>(generator)` |
|
|
186
|
-
| `range(start, end, step)` | 숫자 범위
|
|
187
|
-
| `websocket(websocket)` | WebSocket
|
|
185
|
+
| 메소드 | 설명 | 시간 복잡도 | 공간 복잡도 |
|
|
186
|
+
|------|------|------------|------------|
|
|
187
|
+
| `animationFrame(period: number, delay: number = 0)` | 시간 기반 애니메이션 프레임 스트림을 생성 | O(1)* | O(1) |
|
|
188
|
+
| `blob(blob, chunkSize)` | Blob에서 스트림을 생성 | O(n) | O(chunkSize) |
|
|
189
|
+
| `empty<E>()` | 빈 스트림을 생성 | O(1) | O(1) |
|
|
190
|
+
| `fill<E>(element, count)` | 채워진 스트림을 생성 | O(n) | O(1) |
|
|
191
|
+
| `from<E>(iterable)` | 반복 가능한 객체에서 스트림을 생성 | O(1) | O(1) |
|
|
192
|
+
| `interval(period, delay?)` | 시간 기반 인터벌 스트림을 생성 | O(1)* | O(1) |
|
|
193
|
+
| `iterate<E>(generator)` | 생성자에서 스트림을 생성 | O(1) | O(1) |
|
|
194
|
+
| `range(start, end, step)` | 숫자 범위 스트림을 생성 | O(n) | O(1) |
|
|
195
|
+
| `websocket(websocket)` | WebSocket에서 스트림을 생성 | O(1) | O(1) |
|
|
188
196
|
|
|
189
197
|
```typescript
|
|
190
|
-
//
|
|
198
|
+
// 시맨틱 팩토리 메소드 사용 예
|
|
191
199
|
|
|
192
|
-
// Blob
|
|
200
|
+
// Blob에서 스트림을 생성(청크 읽기)
|
|
193
201
|
blob(someBlob, 1024n)
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
202
|
+
.toUnordered()
|
|
203
|
+
.write(WritableStream)
|
|
204
|
+
.then(callback) // 스트림 쓰기 성공
|
|
205
|
+
.catch(callback); // 스트림 쓰기 실패
|
|
198
206
|
|
|
199
|
-
// 다른 스트림과 연결될 때까지 실행되지
|
|
207
|
+
// 빈 스트림을 생성, 다른 스트림과 연결될 때까지 실행되지 않음
|
|
200
208
|
empty<string>()
|
|
201
|
-
|
|
202
|
-
|
|
209
|
+
.toUnordered()
|
|
210
|
+
.join(); // []
|
|
203
211
|
|
|
204
|
-
// 채워진
|
|
212
|
+
// 채워진 스트림을 생성
|
|
205
213
|
const filledStream = fill("hello", 3); // "hello", "hello", "hello"
|
|
206
214
|
|
|
207
|
-
// 초기 지연 2초, 실행 주기 5초의
|
|
208
|
-
// 타이머 메커니즘으로 구현, 시스템 스케줄링 제한으로 인한 시간 변동 가능성 있음
|
|
215
|
+
// 초기 지연 2초, 실행 주기 5초의 시간 기반 스트림을 생성, 타이머 메커니즘에 기반하여 구현됩니다. 시스템 스케줄링의 정확도 제한으로 인해 시간 드리프트가 발생할 수 있습니다.
|
|
209
216
|
const intervalStream = interval(5000, 2000);
|
|
210
217
|
|
|
211
|
-
// 반복
|
|
218
|
+
// 반복 가능한 객체에서 스트림을 생성
|
|
212
219
|
const numberStream = from([1, 2, 3, 4, 5]);
|
|
213
220
|
const stringStream = from(new Set(["Alex", "Bob"]));
|
|
214
221
|
|
|
215
|
-
// 범위
|
|
222
|
+
// 숫자 범위 스트림을 생성
|
|
216
223
|
const rangeStream = range(1, 10, 2); // 1, 3, 5, 7, 9
|
|
217
224
|
|
|
218
225
|
// WebSocket 이벤트 스트림
|
|
219
226
|
const ws = new WebSocket("ws://localhost:8080");
|
|
220
227
|
websocket(ws)
|
|
221
|
-
.filter((event)=> event.type === "message") // 메시지 이벤트만
|
|
222
|
-
.toUnordered() // 이벤트는 일반적으로
|
|
223
|
-
.forEach((event)=> receive(event)); // 메시지
|
|
228
|
+
.filter((event): boolean => event.type === "message") // 메시지 이벤트만 듣기
|
|
229
|
+
.toUnordered() // 이벤트는 일반적으로 순서가 없음
|
|
230
|
+
.forEach((event): void => receive(event)); // 메시지 받기
|
|
224
231
|
```
|
|
225
232
|
|
|
226
|
-
##
|
|
227
|
-
|
|
228
|
-
|
|
|
229
|
-
|
|
230
|
-
| `concat(other)` | 두
|
|
231
|
-
| `distinct()` |
|
|
232
|
-
| `distinct(comparator)` |
|
|
233
|
-
| `dropWhile(predicate)` | 조건을 만족하는
|
|
234
|
-
| `filter(predicate)` |
|
|
235
|
-
| `flat(mapper)` |
|
|
236
|
-
| `flatMap(mapper)` | 새로운 타입으로
|
|
233
|
+
## 시맨틱 클래스 메소드
|
|
234
|
+
|
|
235
|
+
| 메소드 | 설명 | 시간 복잡도 | 공간 복잡도 |
|
|
236
|
+
|------|------|------------|------------|
|
|
237
|
+
| `concat(other)` | 두 개의 스트림을 연결 | O(n) | O(1) |
|
|
238
|
+
| `distinct()` | 중복을 제거 | O(n) | O(n) |
|
|
239
|
+
| `distinct(comparator)` | 비교자를 사용하여 중복을 제거 | O(n²) | O(n) |
|
|
240
|
+
| `dropWhile(predicate)` | 조건을 만족하는 요소를 버림 | O(n) | O(1) |
|
|
241
|
+
| `filter(predicate)` | 요소를 필터링 | O(n) | O(1) |
|
|
242
|
+
| `flat(mapper)` | 평탄화 맵 | O(n × m) | O(1) |
|
|
243
|
+
| `flatMap(mapper)` | 새로운 타입으로 평탄화 맵 | O(n × m) | O(1) |
|
|
237
244
|
| `limit(n)` | 요소 수 제한 | O(n) | O(1) |
|
|
238
|
-
| `map(mapper)` |
|
|
239
|
-
| `peek(consumer)` |
|
|
245
|
+
| `map(mapper)` | 맵 변환 | O(n) | O(1) |
|
|
246
|
+
| `peek(consumer)` | 요소를 엿보기 | O(n) | O(1) |
|
|
240
247
|
| `redirect(redirector)` | 인덱스 리디렉션 | O(n) | O(1) |
|
|
241
248
|
| `reverse()` | 스트림 반전 | O(n) | O(1) |
|
|
242
|
-
| `shuffle()` |
|
|
243
|
-
| `shuffle(mapper)` | 매퍼를
|
|
249
|
+
| `shuffle()` | 무작위로 섞기 | O(n) | O(1) |
|
|
250
|
+
| `shuffle(mapper)` | 매퍼를 사용하여 섞기 | O(n) | O(1) |
|
|
244
251
|
| `skip(n)` | 처음 n개 요소 건너뛰기 | O(n) | O(1) |
|
|
245
252
|
| `sorted()` | 정렬 | O(n log n) | O(n) |
|
|
246
|
-
| `sorted(comparator)` |
|
|
247
|
-
| `sub(start, end)` |
|
|
253
|
+
| `sorted(comparator)` | 비교자를 사용하여 정렬 | O(n log n) | O(n) |
|
|
254
|
+
| `sub(start, end)` | 서브스트림 가져오기 | O(n) | O(1) |
|
|
248
255
|
| `takeWhile(predicate)` | 조건을 만족하는 요소 가져오기 | O(n) | O(1) |
|
|
249
256
|
| `translate(offset)` | 인덱스 변환 | O(n) | O(1) |
|
|
250
|
-
| `translate(translator)` |
|
|
257
|
+
| `translate(translator)` | 변환자를 사용하여 인덱스 변환 | O(n) | O(1) |
|
|
251
258
|
|
|
252
259
|
```typescript
|
|
253
|
-
//
|
|
260
|
+
// 시맨틱 작업 예
|
|
254
261
|
const result = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
255
|
-
.filter(n => n % 2 === 0)
|
|
256
|
-
.map(n => n * 2)
|
|
257
|
-
.skip(1)
|
|
258
|
-
.limit(3)
|
|
259
|
-
.toUnordered()
|
|
260
|
-
.toArray();
|
|
262
|
+
.filter((n: number): boolean => n % 2 === 0) // 짝수 필터링
|
|
263
|
+
.map((n: number): number => n * 2) // 2배
|
|
264
|
+
.skip(1) // 첫 번째 건너뛰기
|
|
265
|
+
.limit(3) // 3개 요소 제한
|
|
266
|
+
.toUnordered() // 순서가 보장되지 않는 컬렉터로 변환
|
|
267
|
+
.toArray(); // 배열로 변환
|
|
261
268
|
// 결과: [8, 12, 20]
|
|
262
269
|
|
|
263
|
-
// 복잡한 작업
|
|
270
|
+
// 복잡한 작업 예
|
|
264
271
|
const complexResult = range(1, 100, 1)
|
|
265
|
-
.flatMap(n => from([n, n * 2])) // 각 요소를
|
|
266
|
-
.distinct()
|
|
267
|
-
.shuffle()
|
|
268
|
-
.takeWhile(n => n < 50)
|
|
269
|
-
.toOrdered()
|
|
270
|
-
.toArray();
|
|
272
|
+
.flatMap((n: number): Semantics<number> => from([n, n * 2])) // 각 요소를 두 개로 매핑
|
|
273
|
+
.distinct() // 중복 제거
|
|
274
|
+
.shuffle() // 순서 섞기
|
|
275
|
+
.takeWhile((n: number): boolean => n < 50) // 50 미만 요소 가져오기
|
|
276
|
+
.toOrdered() // 순서가 보장되는 컬렉터로 변환
|
|
277
|
+
.toArray(); // 배열로 변환
|
|
271
278
|
```
|
|
272
279
|
|
|
273
|
-
##
|
|
280
|
+
## 시맨틱 변환 메소드
|
|
274
281
|
|
|
275
|
-
|
|
|
282
|
+
| 메소드 | 설명 | 시간 복잡도 | 공간 복잡도 |
|
|
276
283
|
|------------|------------|------------|------------|
|
|
277
|
-
| `sorted()` |
|
|
278
|
-
| `toUnordered()` |
|
|
279
|
-
| `toOrdered()` |
|
|
280
|
-
| `toNumericStatistics()` |
|
|
281
|
-
| `toBigintStatistics()` |
|
|
282
|
-
| `toWindow()` |
|
|
283
|
-
| `toCollectable()` | `UnorderdCollectable
|
|
284
|
-
| `toCollectable(mapper)` |
|
|
284
|
+
| `sorted()` | 순서가 보장되는 컬렉터로 변환 | O(n log n) | O(n) |
|
|
285
|
+
| `toUnordered()` | 순서가 보장되지 않는 컬렉터로 변환 | O(1) | O(1) |
|
|
286
|
+
| `toOrdered()` | 순서가 보장되는 컬렉터로 변환 | O(1) | O(1) |
|
|
287
|
+
| `toNumericStatistics()` | 숫자 통계로 변환 | O(n) | O(1) |
|
|
288
|
+
| `toBigintStatistics()` | BigInt 통계로 변환 | O(n) | O(1) |
|
|
289
|
+
| `toWindow()` | 윈도우 컬렉터로 변환 | O(1) | O(1) |
|
|
290
|
+
| `toCollectable()` | `UnorderdCollectable`로 변환 | O(n) | O(1) |
|
|
291
|
+
| `toCollectable(mapper)` | 커스텀 컬렉터로 변환 | O(n) | O(1) |
|
|
285
292
|
|
|
286
293
|
```typescript
|
|
287
|
-
//
|
|
288
|
-
from([6,4,3,5,2]) //
|
|
289
|
-
.sorted() //
|
|
294
|
+
// 오름차순으로 정렬된 배열로 변환
|
|
295
|
+
from([6,4,3,5,2]) // 스트림 생성
|
|
296
|
+
.sorted() // 스트림을 오름차순으로 정렬
|
|
290
297
|
.toArray(); // [2, 3, 4, 5, 6]
|
|
291
298
|
|
|
292
|
-
//
|
|
293
|
-
from([6,4,3,5,2]) //
|
|
294
|
-
.soted((a, b) => b - a) //
|
|
299
|
+
// 내림차순으로 정렬된 배열로 변환
|
|
300
|
+
from([6,4,3,5,2]) // 스트림 생성
|
|
301
|
+
.soted((a: number, b: number): number => b - a) // 스트림을 내림차순으로 정렬
|
|
295
302
|
.toArray(); // [6, 5, 4, 3, 2]
|
|
296
303
|
|
|
297
|
-
//
|
|
304
|
+
// 역순의 배열로 리다이렉트
|
|
298
305
|
from([6,4,3,5,2])
|
|
299
|
-
.redirect((element, index) => -index) //
|
|
300
|
-
.toOrderd() //
|
|
306
|
+
.redirect((element, index): bigint => -index) // 역순으로 리다이렉트
|
|
307
|
+
.toOrderd() // 리다이렉트된 순서 유지
|
|
301
308
|
.toArray(); // [2, 5, 3, 4, 6]
|
|
302
309
|
|
|
303
|
-
//
|
|
310
|
+
// 리다이렉션을 무시하고 역순의 배열을 얻음
|
|
304
311
|
from([6,4,3,5,2])
|
|
305
|
-
.redirect((element, index) => -index) //
|
|
306
|
-
.toUnorderd() //
|
|
312
|
+
.redirect((element: number, index: bigint) => -index) // 역순으로 리다이렉트
|
|
313
|
+
.toUnorderd() // 리다이렉션된 순서 무시. 이 작업은 `redirect`, `reverse`, `shuffle` 및 `translate` 작업을 무시합니다
|
|
307
314
|
.toArray(); // [2, 5, 3, 4, 6]
|
|
308
315
|
|
|
309
|
-
//
|
|
316
|
+
// 스트림을 역순으로 배열로 변환
|
|
310
317
|
from([6, 4, 3, 5, 2])
|
|
311
|
-
.reverse() //
|
|
312
|
-
.toOrdered() //
|
|
318
|
+
.reverse() // 스트림을 역순으로 함
|
|
319
|
+
.toOrdered() // 역순을 보장함
|
|
313
320
|
.toArray(); // [2, 5, 3, 4, 6]
|
|
314
321
|
|
|
315
|
-
//
|
|
322
|
+
// 섞인 스트림을 배열로 덮어쓰기
|
|
316
323
|
from([6, 4, 3, 5, 2])
|
|
317
|
-
.shuffle() //
|
|
318
|
-
.sorted() //
|
|
324
|
+
.shuffle() // 스트림을 섞음
|
|
325
|
+
.sorted() // 섞인 순서를 덮어씀. 이 작업은 `redirect`, `reverse`, `shuffle` 및 `translate` 작업을 덮어씀
|
|
319
326
|
.toArray(); // [2, 5, 3, 4, 6]
|
|
320
327
|
|
|
321
|
-
//
|
|
328
|
+
// 윈도우 컬렉터로 변환
|
|
322
329
|
from([6, 4, 3, 5, 2]).toWindow();
|
|
323
330
|
|
|
324
|
-
//
|
|
331
|
+
// 숫자 통계로 변환
|
|
325
332
|
from([6, 4, 3, 5, 2]).toNumericStatistics();
|
|
326
333
|
|
|
327
|
-
//
|
|
334
|
+
// BigInt 통계로 변환
|
|
328
335
|
from([6n, 4n, 3n, 5n, 2n]).toBigintStatistics();
|
|
329
336
|
|
|
330
|
-
//
|
|
331
|
-
let customizedCollector = from([1, 2, 3, 4, 5])
|
|
337
|
+
// 데이터 수집을 위한 커스텀 컬렉터 정의
|
|
338
|
+
let customizedCollector = from([1, 2, 3, 4, 5])
|
|
339
|
+
.toCollectable((generator: Generator<E>) => new CustomizedCollector(generator));
|
|
332
340
|
```
|
|
333
341
|
|
|
334
|
-
## Collectable 수집
|
|
342
|
+
## Collectable의 수집 메소드
|
|
335
343
|
|
|
336
|
-
|
|
|
337
|
-
|
|
338
|
-
| `anyMatch(predicate)` |
|
|
339
|
-
| `allMatch(predicate)` | 모든
|
|
340
|
-
| `count()` | 요소
|
|
341
|
-
| `isEmpty()` | 비어 있는지
|
|
342
|
-
| `findAny()` |
|
|
344
|
+
| 메소드 | 설명 | 시간 복잡도 | 공간 복잡도 |
|
|
345
|
+
|------|------|------------|------------|
|
|
346
|
+
| `anyMatch(predicate)` | 임의의 요소가 일치하는지 여부 | O(n) | O(1) |
|
|
347
|
+
| `allMatch(predicate)` | 모든 요소가 일치하는지 여부 | O(n) | O(1) |
|
|
348
|
+
| `count()` | 요소 수 | O(n) | O(1) |
|
|
349
|
+
| `isEmpty()` | 비어 있는지 여부 | O(1) | O(1) |
|
|
350
|
+
| `findAny()` | 임의의 요소 찾기 | O(n) | O(1) |
|
|
343
351
|
| `findFirst()` | 첫 번째 요소 찾기 | O(n) | O(1) |
|
|
344
352
|
| `findLast()` | 마지막 요소 찾기 | O(n) | O(1) |
|
|
345
353
|
| `forEach(action)` | 모든 요소 반복 | O(n) | O(1) |
|
|
346
|
-
| `group(classifier)` |
|
|
347
|
-
| `groupBy(keyExtractor, valueExtractor)` | 키-값
|
|
354
|
+
| `group(classifier)` | 분류자로 그룹화 | O(n) | O(n) |
|
|
355
|
+
| `groupBy(keyExtractor, valueExtractor)` | 키-값 추출자로 그룹화 | O(n) | O(n) |
|
|
348
356
|
| `join()` | 문자열로 결합 | O(n) | O(n) |
|
|
349
|
-
| `join(delimiter)` |
|
|
350
|
-
| `nonMatch(predicate)` |
|
|
351
|
-
| `partition(count)` |
|
|
352
|
-
| `partitionBy(classifier)` |
|
|
357
|
+
| `join(delimiter)` | 구분자를 사용하여 결합 | O(n) | O(n) |
|
|
358
|
+
| `nonMatch(predicate)` | 일치하지 않는 요소가 있는지 여부 | O(n) | O(1) |
|
|
359
|
+
| `partition(count)` | 수로 분할 | O(n) | O(n) |
|
|
360
|
+
| `partitionBy(classifier)` | 분류자로 분할 | O(n) | O(n) |
|
|
353
361
|
| `reduce(accumulator)` | 축소 작업 | O(n) | O(1) |
|
|
354
|
-
| `reduce(identity, accumulator)` | 초기값을
|
|
362
|
+
| `reduce(identity, accumulator)` | 초기값을 가진 축소 | O(n) | O(1) |
|
|
355
363
|
| `toArray()` | 배열로 변환 | O(n) | O(n) |
|
|
356
|
-
| `toMap(keyExtractor, valueExtractor)` |
|
|
357
|
-
| `toSet()` |
|
|
364
|
+
| `toMap(keyExtractor, valueExtractor)` | 맵으로 변환 | O(n) | O(n) |
|
|
365
|
+
| `toSet()` | 세트로 변환 | O(n) | O(n) |
|
|
358
366
|
| `write(stream)` | 스트림에 쓰기 | O(n) | O(1) |
|
|
359
367
|
|
|
360
368
|
```typescript
|
|
361
|
-
// Collectable 작업
|
|
369
|
+
// Collectable 작업 예
|
|
362
370
|
const data = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
363
|
-
.filter(n => n % 2 === 0)
|
|
371
|
+
.filter((n: number): boolean => n % 2 === 0)
|
|
364
372
|
.toOrdered();
|
|
365
373
|
|
|
366
|
-
// 일치 확인
|
|
367
|
-
console.log(data.anyMatch(n => n > 5)); // true
|
|
368
|
-
console.log(data.allMatch(n => n < 20)); // true
|
|
374
|
+
// 일치 여부 확인
|
|
375
|
+
console.log(data.anyMatch((n: number): boolean => n > 5)); // true
|
|
376
|
+
console.log(data.allMatch((n: number): boolean => n < 20)); // true
|
|
369
377
|
|
|
370
|
-
//
|
|
371
|
-
data.findFirst().ifPresent(n => console.log(n)); // 2
|
|
372
|
-
data.findAny().ifPresent(n => console.log(n)); //
|
|
378
|
+
// 찾기 작업
|
|
379
|
+
data.findFirst().ifPresent((n: number): void => console.log(n)); // 2
|
|
380
|
+
data.findAny().ifPresent((n: number): void => console.log(n)); // 임의의 요소
|
|
373
381
|
|
|
374
382
|
// 그룹화 작업
|
|
375
383
|
const grouped = data.groupBy(
|
|
376
|
-
n => n > 5 ? "
|
|
377
|
-
n => n * 2
|
|
378
|
-
);
|
|
379
|
-
// {small: [4, 8], large: [12, 16, 20]}
|
|
384
|
+
(n: number): string => (n > 5 ? "큰" : "작은"),
|
|
385
|
+
(n: number): number => n * 2
|
|
386
|
+
); // {작은: [4, 8], 큰: [12, 16, 20]}
|
|
380
387
|
|
|
381
388
|
// 축소 작업
|
|
382
389
|
const sum = data.reduce(0, (acc, n) => acc + n); // 30
|
|
383
390
|
|
|
384
391
|
// 출력 작업
|
|
385
|
-
data.join(", "); // "2, 4, 6, 8, 10"
|
|
392
|
+
data.join(", "); // "[2, 4, 6, 8, 10]"
|
|
386
393
|
```
|
|
387
394
|
|
|
388
|
-
## 통계 분석
|
|
395
|
+
## 통계 분석 메소드
|
|
389
396
|
|
|
390
|
-
### NumericStatistics
|
|
397
|
+
### NumericStatistics 메소드
|
|
391
398
|
|
|
392
|
-
|
|
|
393
|
-
|
|
399
|
+
| 메소드 | 설명 | 시간 복잡도 | 공간 복잡도 |
|
|
400
|
+
|------|------|------------|------------|
|
|
394
401
|
| `range()` | 범위 | O(n) | O(1) |
|
|
395
402
|
| `variance()` | 분산 | O(n) | O(1) |
|
|
396
|
-
| `standardDeviation()` |
|
|
403
|
+
| `standardDeviation()` | 표준 편차 | O(n) | O(1) |
|
|
397
404
|
| `mean()` | 평균 | O(n) | O(1) |
|
|
398
405
|
| `median()` | 중앙값 | O(n log n) | O(n) |
|
|
399
406
|
| `mode()` | 최빈값 | O(n) | O(n) |
|
|
400
407
|
| `frequency()` | 빈도 분포 | O(n) | O(n) |
|
|
401
408
|
| `summate()` | 합계 | O(n) | O(1) |
|
|
402
|
-
| `quantile(quantile)` |
|
|
403
|
-
| `interquartileRange()` |
|
|
409
|
+
| `quantile(quantile)` | 사분위수 | O(n log n) | O(n) |
|
|
410
|
+
| `interquartileRange()` | 사분위수 범위 | O(n log n) | O(n) |
|
|
404
411
|
| `skewness()` | 왜도 | O(n) | O(1) |
|
|
405
412
|
| `kurtosis()` | 첨도 | O(n) | O(1) |
|
|
406
413
|
|
|
407
414
|
```typescript
|
|
408
|
-
// 통계 분석
|
|
409
|
-
|
|
415
|
+
// 통계 분석 예
|
|
416
|
+
let numbers = from([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
|
|
410
417
|
.toNumericStatistics();
|
|
411
418
|
|
|
412
419
|
console.log("평균:", numbers.mean()); // 5.5
|
|
413
420
|
console.log("중앙값:", numbers.median()); // 5.5
|
|
414
|
-
console.log("
|
|
421
|
+
console.log("표준 편차:", numbers.standardDeviation()); // ~2.87
|
|
415
422
|
console.log("합계:", numbers.summate()); // 55
|
|
416
423
|
|
|
417
424
|
// 매퍼를 사용한 통계 분석
|
|
418
425
|
const objects = from([
|
|
419
426
|
{ value: 10 },
|
|
420
|
-
{ value: 20 },
|
|
427
|
+
{ value: 20 },
|
|
421
428
|
{ value: 30 }
|
|
422
429
|
]).toNumericStatistics();
|
|
423
|
-
|
|
424
430
|
console.log("매핑된 평균:", objects.mean(obj => obj.value)); // 20
|
|
425
431
|
```
|
|
426
432
|
|
|
427
433
|
## 성능 선택 가이드
|
|
428
434
|
|
|
429
|
-
###
|
|
435
|
+
### 순서 보장이 필요 없는 Collector 선택(성능 우선)
|
|
430
436
|
```typescript
|
|
431
|
-
// 순서 보장이
|
|
432
|
-
|
|
437
|
+
// 순서 보장이 필요 없는 경우, 최고의 성능을 위해 순서가 보장되지 않는 Collector 사용
|
|
438
|
+
let highPerformance = data
|
|
433
439
|
.filter(predicate)
|
|
434
440
|
.map(mapper)
|
|
435
|
-
.toUnoredered(); //
|
|
441
|
+
.toUnoredered(); // 최고의 성능
|
|
436
442
|
```
|
|
437
443
|
|
|
438
|
-
###
|
|
444
|
+
### 순서가 필요한 Collector 선택(순서 필요)
|
|
439
445
|
```typescript
|
|
440
|
-
//
|
|
441
|
-
|
|
446
|
+
// 요소의 순서를 유지해야 하는 경우, 순서가 보장되는 Collector 사용
|
|
447
|
+
let ordered = data.sorted(comparator);
|
|
442
448
|
```
|
|
443
449
|
|
|
444
|
-
### 윈도우
|
|
450
|
+
### 윈도우 작업이 필요한 Collector 선택(윈도우 작업)
|
|
445
451
|
```typescript
|
|
446
452
|
// 윈도우 작업이 필요한 경우
|
|
447
|
-
|
|
453
|
+
let windowed: WindowCollectable<number> = data
|
|
448
454
|
.toWindow()
|
|
449
455
|
.slide(5n, 2n); // 슬라이딩 윈도우
|
|
450
456
|
```
|
|
451
457
|
|
|
452
|
-
### 통계 분석 선택
|
|
458
|
+
### 수치 계산이 필요한 통계 분석 선택(수치 계산)
|
|
453
459
|
```typescript
|
|
454
460
|
// 통계 분석이 필요한 경우
|
|
455
|
-
|
|
456
|
-
.toNumericStatistics(); //
|
|
461
|
+
let statistics: NumericStatistics<number> = data
|
|
462
|
+
.toNumericStatistics(); // 수치 통계
|
|
457
463
|
|
|
458
|
-
|
|
459
|
-
.toBigintStatistics(); //
|
|
464
|
+
let bigIntStatistics: BigintStatistics<bigint> = data
|
|
465
|
+
.toBigintStatistics(); // 큰 정수 통계
|
|
460
466
|
```
|
|
461
467
|
|
|
462
468
|
[GitHub](https://github.com/eloyhere/semantic-typescript)
|
|
463
469
|
[NPMJS](https://www.npmjs.com/package/semantic-typescript)
|
|
464
470
|
|
|
465
|
-
## 중요한
|
|
471
|
+
## 중요한 참고 사항
|
|
466
472
|
|
|
467
|
-
1. **정렬 작업의 영향**:
|
|
468
|
-
2. **성능
|
|
469
|
-
3. **메모리 사용량**: 정렬 작업에는 O(n)의
|
|
470
|
-
4. **실시간 데이터**:
|
|
473
|
+
1. **정렬 작업의 영향**: 순서가 보장되는 컬렉터에서 `sorted()` 작업은 `redirect`, `translate`, `shuffle`, `reverse`의 효과를 무시합니다.
|
|
474
|
+
2. **성능 고려 사항**: 순서 보장이 필요하지 않은 경우, `toUnordered()`를 사용하여 성능을 향상시키는 것이 좋습니다.
|
|
475
|
+
3. **메모리 사용량**: 정렬 작업에는 추가적인 O(n)의 메모리가 필요합니다.
|
|
476
|
+
4. **실시간 데이터**: 시맨틱 스트림은 실시간 데이터 처리에 적합하며 비동기 데이터 소스를 지원합니다.
|
|
471
477
|
|
|
472
|
-
이 라이브러리는
|
|
478
|
+
이 라이브러리는 타입스크립트 개발자에게 강력하고 유연한 스트리밍 기능을 제공하며, 함수형 프로그래밍의 이점과 타입 안전성 보장을 결합합니다.
|