handle
메소드는 인스턴스 메서드이다. 일반적인 operator와 마찬가지로 기존의 소스에 체이닝 할 수 있다는 의미이다. Mono
와 Flux
모두 이 메서드를 제공한다.
generate
와 유사한데, SynchronousSink
를 사용하고 한번에 하나씩만 발행하기 때문이다. 그러나 handle
을 사용하면 각 소스의 요소로 부터 임의의 값을 생성(map
)할 수 있으며, 어떤 요소는 건너뛸 수도 있다. 이러하기 때문에 map
과 filter
를 조합한 것 처럼 동작한다. 시그니처는 다음과 같다:
Flux<R> handle(BiConsumer<T, SynchronousSink<R>>);
예제를 살펴보자. 리액티브 스트림의 스펙에는 시퀀스에 null
을 허용하지 않는다. 기존 메서드를 사용하여 map
을 실행하고 싶은데 해당 메서드가 때때로 null
을 반환한다면 어떻게 해야 할까?
다음 메소드는 integer 소스에 안전하게 적용될 수 있다.
public String alphabet(int letterNumber) {
if (letterNumber < 1 || letterNumber > 26) {
return null; // 여기에서 null을 반환한다
}
int letterIndexAscii = 'A' + letterNumber - 1;
return "" + (char) letterIndexAscii;
}
handle
을 사용해서 null
을 제거할 수 있다.
// -1, 30은 alphabet()에서 null을 반환하게 된다.
Flux<String> alphabet = Flux.just(-1, 30, 13, 9, 20)
.handle((i, sink) -> {
String letter = alphabet(i);
if (letter != null)
sink.next(letter);
});
alphabet.subscribe(System.out::println);
결과는 다음과 같다.
M // 13
I // 9
T // 20
'잡다구리' 카테고리의 다른 글
기초부터 다지는 ElasticSearch 운영 노하우 : 스터디 기록 (0) | 2022.08.13 |
---|---|
Hexagonal Architecture with Java and Spring (0) | 2022.08.13 |
Building a Multi-Module Spring Boot Application with Gradle (0) | 2022.08.13 |
What is Upstream and Downstream in Software Development (0) | 2022.08.13 |
reactor: Synchronous generate (0) | 2022.08.13 |
reactor: 동기적인 블로킹 호출을 감싸기 (0) | 2022.08.13 |
reactor: publishOn, subscribeOn() (0) | 2022.08.13 |
docker-compose에서 다른 서비스가 healthy 상태여야 특정 서비스를 기동하여야 할 때 (0) | 2022.08.13 |
댓글