Flux.just(1, 2, 3)
.flatMap(c -> {
System.out.println("flatmap1 :" + c + ", return Flux.emptu()");
return Flux.<String>empty();
.switchIfEmpty(Flux.defer(() -> {
System.out.println("switchIfEmpty1");
return Flux.empty();
})).flatMap(b -> {
System.out.println("flatmap2");
return Flux.<String>empty();
}).switchIfEmpty(Flux.defer(() -> {
System.out.println("switchIfEmpty2");
return Flux.just("S");
})).subscribe((d) -> {
System.out.println("subscribe : " + d);
flatmap1 :1, return Flux.empty()
flatmap1 :2, return Flux.empty()
flatmap1 :3, return Flux.empty()
switchIfEmpty1 Flux.empty()
switchIfEmpty2 Flux.just("S")
subscribe : S
flatmap1에서 1, 2, 3 반복에 대한 empty를 반환하게 되면 그다음 switchIfEmpty가 반환된다 그리고 또 empty를 반환되면 flatmap2을 건너뛰고 그 다음 switchIfEmpty를 실행하게 된다 출력 때문에 이해하기 쉬울 것이다
그럼 1, 2, 3 반복 중에 하나라도 empty()를 반환하지 않는다면 어떻게 될까?
Flux.just(1, 2, 3)
.flatMap(c -> {
System.out.println("flatmap1 :" + c + ", return Flux.empty()");
if (c == 2) {
return Flux.just(c);
return Flux.empty();
.switchIfEmpty(Flux.defer(() -> {
System.out.println("switchIfEmpty1");
return Flux.empty();
})).flatMap(b -> {
System.out.println("flatmap2");
return Flux.<String>empty();
}).switchIfEmpty(Flux.defer(() -> {
System.out.println("switchIfEmpty2");
return Flux.just("S");
})).subscribe((d) -> {
System.out.println("subscribe : " + d);
flatmap1 :1, return Flux.empty()
flatmap2 return Flux.<String>empty()
flatmap1 :3, return Flux.empty()
switchIfEmpty2 return Flux.just("S")
subscribe : S
바로 아래 있는 switchIfEmpty1은 실행되지 않는다
switchIfEmpty에 Flux.differ가 들어가 있는지는 아래 링크를 참조하길 바란다.
https://coding-start.tistory.com/372
그럼 어떻게 응용할 수 있을까? 뭐 다양하게 있지만 나 같은 경우에는 실무에서 캐시에 데이터가 있는지 확인하고 없으면 db나 api를 찌르는 방식으로 사용한다 그 외에도 다양한 케이스가 있을 것이고 이것은 하나의 예이다
public Mono getGoodsList() {
return cache.getCache() 캐시를 가져온다
.flatMap(data -> Mono.just(data)) 캐시에서 가져온 데이터를 가공한다
.switchIfEmpty(Mono.defer(() -> db.call() or api.call()))
cache.getCache()에서 empty를 반환했다면 () -> db.call() or api.call()를 실행
아래는 그냥 만든 예제인데 궁금하면 한번 보시길!
Flux.just(1, 2, 3)
.flatMap(c -> {
System.out.println("flatmap1 :" + c + ", return Flux.emptu()");
return Flux.<String>empty();
.switchIfEmpty(Flux.defer(() -> {
System.out.println("switchIfEmpty1");
return Flux.just("s");
})).flatMap(b -> {
System.out.println("flatmap2");
return Flux.<String>empty();
}).switchIfEmpty(Flux.defer(() -> {
System.out.println("switchIfEmpty2");
return Flux.just("S");
})).subscribe((d) -> {
System.out.println("subscribe : " + d);
flatmap1 :1, return Flux.empty()
flatmap1 :2, return Flux.empty()
flatmap1 :3, return Flux.empty()
switchIfEmpty1 return Flux.just("s")
flatmap2 return return Flux.<String>empty()
switchIfEmpty2 return Flux.<String>empty()
subscribe : S
Flux.just(1, 2, 3)
.flatMap(c -> {
System.out.println("flatmap1 :" + c + ", Flux.just(c);");
return Flux.just(c);
.switchIfEmpty(Flux.defer(() -> {
System.out.println("switchIfEmpty1");
return Flux.empty();
})).flatMap(b -> {
System.out.println("flatmap2");
return Flux.<String>empty();
}).switchIfEmpty(Flux.defer(() -> {
System.out.println("switchIfEmpty2");
return Flux.just("S");
})).subscribe((d) -> {
System.out.println("subscribe : " + d);
flatmap1 :1, return Flux.just(c)
flatmap2 return Flux.<String>empty()
flatmap1 :2, Flux.just(c)
flatmap2 return Flux.<String>empty()
flatmap1 :3, Flux.just(c)
flatmap2 return Flux.<String>empty()
switchIfEmpty2 Flux.just("S")
subscribe : S