본문 바로가기
잡다구리

reactor: Handle

by Growing! 2022. 8. 13.

원문: reactor reference

handle 메소드는 인스턴스 메서드이다. 일반적인 operator와 마찬가지로 기존의 소스에 체이닝 할 수 있다는 의미이다. MonoFlux 모두 이 메서드를 제공한다.

generate와 유사한데, SynchronousSink를 사용하고 한번에 하나씩만 발행하기 때문이다. 그러나 handle을 사용하면 각 소스의 요소로 부터 임의의 값을 생성(map)할 수 있으며, 어떤 요소는 건너뛸 수도 있다. 이러하기 때문에 mapfilter를 조합한 것 처럼 동작한다. 시그니처는 다음과 같다:

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
 
 

댓글