
buffer(n) – 데이터를 n개씩 모아서 List로 emitbuffer(n)은 스트림에서 emit되는 데이터를 n개 단위로 묶어 List 형태로 전달하는 오퍼레이터이다. 마지막 남은 데이터도 모아서 emit한다.
Flux.range(1, 95)
.buffer(10)
.subscribe(System.out::println);
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[11, 12, ..., 20]
...
[91, 92, 93, 94, 95]
bufferTimeout(n, duration) – 개수 또는 시간 기준으로 List emitbufferTimeout(n, d)는 다음 조건 중 하나라도 충족되면 데이터를 List로 emit한다:
Flux.range(1, 20)
.map(num -> {
Thread.sleep(100); // 일부러 지연
return num;
})
.bufferTimeout(3, Duration.ofMillis(400))
.subscribe(System.out::println);
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
...
[19, 20]
window(n) – 데이터를 n개씩 분할하여 작은 Flux로 emitwindow(n)은 buffer(n)과 유사하지만, 데이터를 List로 묶는 대신 작은 단위의 Flux로 나눈다.
→ 결과 타입은 Flux<Flux<T>>.
보통 flatMap() 또는 concatMap()을 이용해 내부 Flux를 처리한다.
Flux.range(1, 11)
.window(3)
.flatMap(flux -> {
System.out.println("New Window");
return flux.collectList()
.doOnNext(list -> System.out.println("Window Contents: " + list))
.flatMapMany(list -> MathFlux.sumInt(Flux.fromIterable(list)));
})
.subscribe(sum -> System.out.println("Window Sum: " + sum));
New Window
Window Contents: [1, 2, 3]
Window Sum: 6
New Window
Window Contents: [4, 5, 6]
Window Sum: 15
New Window
Window Contents: [7, 8, 9]
Window Sum: 24
New Window
Window Contents: [10, 11]
Window Sum: 21
groupBy(keyMapper) – 데이터를 key에 따라 그룹화groupBy(keyFn)은 데이터를 특정 키 기준으로 GroupedFlux로 나눠 emit한다.
Flux<GroupedFlux<K, V>> 형태가 되며, 각 그룹은 key()를 가지고 있다.
Flux.range(1, 95)
.groupBy(num -> num % 10)
.flatMap(groupedFlux ->
groupedFlux.collectList()
.map(list -> List.of(groupedFlux.key(), list))
)
.subscribe(data -> System.out.println("data: " + data));
data: [0, [10, 20, 30, ..., 90]]
data: [1, [1, 11, 21, ..., 91]]
data: [2, [2, 12, 22, ..., 92]]
...
| 오퍼레이터 | 동작 방식 | 반환 타입 | 특징 요약 |
|---|---|---|---|
buffer(n) | n개씩 묶어서 List로 emit | Flux<List<T>> | 가장 단순한 분할 방식 |
bufferTimeout(n,d) | n개 모이거나 d시간 지나면 emit | Flux<List<T>> | 시간 기반 버퍼링 지원 |
window(n) | n개씩 묶인 작은 Flux를 emit | Flux<Flux<T>> | 내부 Flux 처리 필요 |
groupBy(keyFn) | key 값 기준으로 GroupedFlux 생성 | Flux<GroupedFlux<K,T>> | 동적 그룹핑에 유리 |