添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
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